У меня есть список строк, которые я хотел бы записать в CSV-файл. Список list_results выглядит так

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

Итак, я бы попробовал что-то вроде этого:

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

К сожалению, данные не записываются в три столбца. Я нахожу:

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

Как правильно отформатировать это поведение, чтобы получить

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

Желательно в формате %s %d %d?

11
ShanZhengYang 15 Дек 2015 в 12:16

4 ответа

Лучший ответ

Вы используете writer.writerows() с s в конце. Этот метод ожидает список списков , но вы передали список строк. Метод writerows() по существу делает это:

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

Где каждая строка должна быть последовательностью столбцов. Строка - это последовательность отдельных символов, так что вот что вы пишете: отдельные символы, разделенные выбранным вами разделителем.

Вам нужно будет разбить вашу строку на столбцы, не включая запятые самостоятельно, задача объекта писателя состоит в том, чтобы включить их:

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)

Или используя выражение генератора, чтобы вы могли продолжать использовать 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)

Демо:

>>> 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
6
Martijn Pieters 15 Дек 2015 в 09:35

Он отлично работает:

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

Это исходный код writer.writerows() на 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;

}

0
mrvol 15 Дек 2015 в 10:09

writerows ожидает список списков. Таким образом, если вы передадите список writerows, он преобразует его в список списков (то есть фрагментирует слова в буквы.

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])

Или, если вы хотите использовать 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)

Выход-

Correct?    Successes   Failures
FALSE   60  40
TRUE    70  30
-1
SIslam 24 Дек 2015 в 17:39

Скорее всего, ваш list_results содержит что-то вроде:

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

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.split(',')] for r in list_results)
0
mirosval 15 Дек 2015 в 09:28