Как записать CSV-файл в двоичном режиме? - PullRequest
0 голосов
/ 01 мая 2018

Не поддерживает ли python csv Writer больше бинарный режим?

Мне до сих пор не приходилось писать в режиме 'b', и я получаю очень досадные ошибки, например:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-030fb0c9dc9a> in <module>()
  4 with open('test.csv', 'wb') as f:
  5     w = csv.writer(f)
----> 6     w.writerows(rows)

TypeError: a bytes-like object is required, not 'str'

Код:

import csv

rows = [b'1,2,3', b'4,5,6', b'7,8,9']
with open('test.csv', 'wb') as f:
    w = csv.writer(f)
    w.writerows(rows)

Если бы кто-нибудь мог объяснить ошибку, было бы здорово. Я передаю итерируемое, где каждый элемент является байтовой последовательностью, но я все еще получаю ошибку о том, что входные данные не являются «байтами», а вместо этого являются «str». Такое поведение кажется неожиданным.

Я знаю, что приведенный выше фрагмент кода может записать в обычный файл, если я отключу двоичный режим. Если у кого-то есть конструктивное решение или предложение, я был бы очень признателен.

1 Ответ

0 голосов
/ 01 мая 2018

Модуль csv в Python 3 всегда пытается записать строки, а не байты :

Чтобы максимально упростить взаимодействие с модулями, которые реализуют API БД, значение None записывается в виде пустой строки. [...] Все другие нестроковые данные перед записью преобразуются в строку с помощью str ().

Это означает, что вы должны передать ему файловый объект, который принимает строки, что обычно означает открытие его в текстовом режиме.

Если вы застряли с файловым объектом, которому нужны байты, оберните его в io.TextIOWrapper для обработки кодировки str-> байтов:

# assuming you want utf-8
with io.TextIOWrapper(binary_file, encoding='utf-8', newline='') as text_file:
    w = csv.writer(text_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...