Я не знаю, почему мой Writerow () читает каждый символ в списке как отдельный элемент данных - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть список result, который содержит мои данные.Например:

result =  ['This is first | element', 'This is second | element', 'This is third | element']

Я экспортирую это в csv-файл, используя Writerow () с кодом ниже:

import csv

with open('names.csv', 'w', newline='') as csvfile:
    filewriter = csv.writer(csvfile, delimiter='|', quotechar='\"', quoting=csv.QUOTE_MINIMAL)
    for i in range(len(result)):
        filewriter.writerow(result[i])
    csvfile.flush()
    csvfile.close()

Но на удивление это экспортирует мой список следующим образом:

T|h|i|s| i|s| f|i|r|s|t|"|"|e|l|e|m|e|n|t|
T|h|i|s| i|s| s|e|c|o|n|d|"|"|e|l|e|m|e|n|t|
T|h|i|s| i|s| t|h|i|r|d|"|"|e|l|e|m|e|n|t|

Понятия не имею, почему это происходит.Может кто-нибудь сказать, пожалуйста, почему это происходит и как это исправить?Что я сделал не так в своем коде?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

csvwriter.writerow ожидал список в качестве входных данных.
Таким образом, когда вы пишете This is first | element, данные преобразуются в ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'f', 'i', 'r', 's', 't', ' ', '|', ' ', 'e', 'l', 'e', 'm', 'e', 'n', 't'], и это отражается в CSV.

Вам нужно будет обернуть каждый элемент в вашем списке в другой список, поэтому результирующий список будет [['This is first | element'], ['This is second | element'], ['This is third | element']], который вы можете записать в CSV.

Код изменится на.

result =  ['This is first | element', 'This is second | element', 'This is third | element']
#Convert result to list of lists
li = [[item] for item in result]

import csv

with open('file.csv', 'w', newline='') as csvfile:
    filewriter = csv.writer(csvfile)
    #Write each list to csv
    for item in li:
        filewriter.writerow(item)
    csvfile.flush()
    csvfile.close()

Вы также можете избавиться от цикла for, используя csvwriter.writerows следующим образом.

result =  ['This is first | element', 'This is second | element', 'This is third | element']
li = [[item] for item in result]

import csv

with open('file.csv', 'w', newline='') as csvfile:
    filewriter = csv.writer(csvfile)
    filewriter.writerows(li)
    csvfile.flush()
    csvfile.close()

В обоих случаях CSV будет:

This is first | element
This is second | element
This is third | element
0 голосов
/ 24 апреля 2019

Строки можно интерпретировать как списки в Python.Функция writewrow ожидает список в качестве входных данных, где каждый элемент списка представляет собой один столбец файла CSV.Строковые элементы вашего списка результатов, следовательно, интерпретируются как списки, в которых каждый символ представляет столбец.

Вы можете заключить каждую строку в дополнительный список следующим образом:

result =  [['This is first | element'], ['This is second | element'], ['This is third | element']]

Что дает вам:

"This is first | element"
"This is second | element"
"This is third | element"

Надеюсь, это то, что вы хотите.

...