TypeError: кодирование или ошибки без строкового аргумента

Я пытаюсь записать список байтов данных в файл CSV. Поскольку это список байтовых строк, я использовал следующий код:

with open(r"E:\Avinash\Python\extracting-drug-data\out.csv", "wb") as w:
    writer = csv.writer(w)
    writer.writerows(bytes(datas, 'UTF-8'))

Но это приводит к следующей ошибке:

TypeError: кодировка или ошибки без строкового аргумента

datas - это список байтовых строк.

print(datas)

доходность

[b'DB08873', b' MOLSDFPDBSMILESInChIView Structure \xc3\x97Structure for DB08873 (Boceprevir) Close', b'394730-60-0', b'LHHCSNFAOIFYRV-DOVBMPENSA-N', b'Organic acids and derivatives  ', b'Food increases exposure of boceprevir by up to 65% relative to fasting state. However, type of food and time of meal does not affect bioavailability of boceprevir and thus can be taken without regards to food.  \r\nTmax = 2 hours;\r\nTime to steady state, three times a day dosing = 1 day;\r\nCmax]

Я хочу, чтобы приведенный выше список был напечатан в виде первой строки в файле CSV с декодированием символов Unicode. То есть в \xc3\x97 должен быть преобразован соответствующий ему символ.

Ответ 1

Кажется, что ваш datas уже в байтах, поэтому, чтобы превратить его в строки UTF-8, вы должны использовать str, а не bytes! Кроме того, вам нужно преобразовать каждый элемент из datas отдельно, а не весь список одновременно. Наконец, если вы хотите добавить datas как одну строку в out.csv, вы должны использовать writerow, тогда как writerows будет записывать все строки одновременно, и, соответственно, будет ожидать список списков.

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

Это похоже на то, что вы хотите. Результатом является CSV файл с одной строкой 1 данных в формате UTF-8, а \xc3\x97 декодируется до ×.

import csv
with open(r"out.csv", "w", encoding='UTF-8') as w:
    writer = csv.writer(w)
    writer.writerow([str(d, 'UTF-8') for d in datas])

1) Обратите внимание, что последний элемент в datas содержит некоторые разрывы строк и, следовательно, будет разбит на несколько строк. Это, вероятно, не то, что вы хотите. Или это сбой в вашем списке datas?

Ответ 2

Эта ошибка означает, что то, что вы передаете в bytes (строка, которую вы хотите преобразовать в последовательность байтов), на самом деле не является строкой. Это не означает, что аргумент уже имеет тип bytes, просто это не строка.

>>> bytes(b"", encoding="utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding without a string argument
>>> bytes(None, encoding="utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding without a string argument
>>> bytes(12, encoding="utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding without a string argument