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