Ответ 1
В документации говорится, что вы должны использовать open('eggs.csv', 'w', newline='')
Я пытаюсь использовать Python 3.2 на компьютере под управлением Windows для записи простого CSV файла, но мне не повезло. Из документации модуля csv для Python 3.2:
>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
... quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
создает файл с каждой строкой, завершаемой байтовой последовательностью \r\r\n
, поэтому похоже, что каждая строка имеет дополнительную пустую строку при ее открытии с помощью, например, MS Excel. Это не "файл CSV".
Заметьте, если я попробую тот же пример для Python 2.7 в Python 3.2 (где большая разница 'w'
vs 'wb'
для файлового режима), Я получаю сообщение об ошибке при попытке spamWriter.writerow
:
Traceback (последний последний вызов): Файл "", строка 1, в TypeError: 'str' не поддерживает интерфейс буфера
Как написать простой файл CSV из Python 3.2 на компьютере под управлением Windows?
В документации говорится, что вы должны использовать open('eggs.csv', 'w', newline='')
Это будет работать как на Python 2, так и на Python 3:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Как задокументировано в footnote:
csv.writer(csvfile, dialect='excel', **fmtparams)
Если csvfile является файловым объектом, его следует открыть с помощью newline = ''.
Если newline = '' не указывается, новые строки, встроенные в кавычки, не будут интерпретироваться правильно, а на платформах, использующих \r\n linendings при записи добавляется дополнительный \r. Всегда должно быть безопасно указывать newline = '', так как модуль csv выполняет свою собственную (универсальную) обработку новой строки.
Следующий вариант работает в Linux и Windows:
spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
quoting=csv.QUOTE_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
Чтобы напрямую ответить на ваш вопрос, вы должны использовать параметр lineterminator:
... поэтому изменение этой строки должно работать (непроверено):
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
... quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
Что касается того, почему пример не работает из коробки, вид выглядит как ошибка для меня.
[Для Python 2.x] Эта реализация spamWriter работает для меня...
with open('assignmentresults.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(["Hullo", "World"])
Я решил эту ошибку, когда я переместил один из моих кодов из Python2.6.6 в python3.4.3
Python2.6.6 (я пытаюсь выполнить обфускацию на моем csvfile)
with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))
Сработало хорошо с python2.6.6, но не работало на python3.4.3, поскольку я получал некоторые unicode-ошибки utf-8, когда я пытался запустить файл python3, поэтому сделал следующие изменения Python3.4.4
import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))
Что он, мой код работает отлично сейчас, в основном python3 не рассматривает некоторые из Юникода, и нам нужно использовать импорт кодеков, чтобы он работал, надеюсь, что это поможет.