Csv: writer.writerows () shares my string inputs

I have a list of lines that I would like to write to the csv file. The list_results list looks like

 ['False, 60, 40 ', 'True, 70, 30, '] 

So, I would try something like this:

 with open('example1.csv', 'w') as result: writer = csv.writer(result, delimiter=",") writer.writerow( ('Correct?', 'Successes', 'Failures') ) writer.writerows(list_results) 

Unfortunately, the data is not written in three columns. I find:

 ['Correct?', 'Successes', 'Failures'] ['F', 'a', 'l', 's', 'e', ',', ' ', '6', '0', ',', ' ', '4', '0', ' '] ['T', 'r', 'u', 'e', ',', ' ', '7', '0', ',', ' ', '3', '0', ',', ' '] 

How to format this behavior correctly to get

 ['Correct?', 'Successes', 'Failures'] ['False', 60, 40] ['True', 70, 30] 

Preferably in the format %s %d %d ?

+4
source share
4 answers

You are using writer.writerows() with s at the end. This method expects a list of lists, but you passed a list of strings. The writerows() method essentially does this:

 def writerows(self, rows): for row in rows: self.writerow(row) 

where each row should be a sequence of columns. A string is a sequence of individual characters, so you wrote: individual characters, separated by your chosen delimiter.

You need to divide your row into columns, do not include commas yourself, this is the task of the author object to include them:

 with open('example1.csv', 'w') as result: writer = csv.writer(result, delimiter=",") writer.writerow(('Correct?', 'Successes', 'Failures')) for row in list_results: columns = [c.strip() for c in row.strip(', ').split(',')] writer.writerow(columns) 

or using a generator expression so you can use writerows() :

 with open('example1.csv', 'w') as result: writer = csv.writer(result, delimiter=",") writer.writerow(('Correct?', 'Successes', 'Failures')) writer.writerows([c.strip() for c in r.strip(', ').split(',')] for r in list_results) 

Demo:

 >>> import csv >>> list_results = ['False, 60, 40 ', 'True, 70, 30, '] >>> import csv >>> import sys >>> list_results = ['False, 60, 40 ', 'True, 70, 30, '] >>> writer = csv.writer(sys.stdout) >>> writer.writerow(('Correct?', 'Successes', 'Failures')) Correct?,Successes,Failures >>> for row in list_results: ... columns = [c.strip() for c in row.strip(', ').split(',')] ... writer.writerow(columns) ... False,60,40 True,70,30 >>> writer.writerows([c.strip() for c in r.strip(', ').split(',')] ... for r in list_results) False,60,40 True,70,30 
+2
source

Most likely your list_results contains something like:

 ['False, 60, 40 ', 'True, 70, 30, '] 

writerows() accepts a list of lists, you provide a list of strings, the string is iterable and thus converted to a list of characters what you want:

 with open('example1.csv', 'w') as result: writer = csv.writer(result, delimiter=",") writer.writerow( ('Correct?', 'Successes', 'Failures') ) writer.writerows([c.strip() for c in r.split(',')] for r in list_results) 
0
source

It works fine:

list_results = [(False, 60, 40), (True, 70, 30)]

This is the source code for writer.writerows() in C.

 static PyObject * csv_writerows(WriterObj *self, PyObject *seqseq) { PyObject *row_iter, *row_obj, *result; 
 row_iter = PyObject_GetIter(seqseq); if (row_iter == NULL) { PyErr_SetString(PyExc_TypeError, "writerows() argument must be iterable"); return NULL; } while ((row_obj = PyIter_Next(row_iter))) { result = csv_writerow(self, row_obj); Py_DECREF(row_obj); if (!result) { Py_DECREF(row_iter); return NULL; } else Py_DECREF(result); } Py_DECREF(row_iter); if (PyErr_Occurred()) return NULL; Py_INCREF(Py_None); return Py_None; 

}

code>
0
source

writerows expects a list of lists. Therefore, if you give a list of writerows , it will convert it to a list of the list (i.e. it will fragment the words into letters.

 import csv list_results = ['False, 60, 40 ', 'True, 70, 30, '] with open(r"C:\test.csv", 'wb') as result: writer = csv.writer(result, delimiter=",") writer.writerow( ('Correct?', 'Successes', 'Failures') ) writer.writerows([i.strip().split(',') for i in list_results]) 

Or if you want to use writerow -

 import csv list_results = ['False, 60, 40 ', 'True, 70, 30, '] with open(r"C:\mnp_.csv", 'wb') as result: writer = csv.writer(result, delimiter=",") writer.writerow( ('Correct?', 'Successes', 'Failures') ) data = [i.strip().split(',') for i in list_results] for d in data: writer.writerow(d) 

Output -

 Correct? Successes Failures FALSE 60 40 TRUE 70 30 
-1
source

Source: https://habr.com/ru/post/1238241/


All Articles