Я получаю следующую ошибку при попытке записать строку в файл в Python:
Traceback (most recent call last):
File "export_off.py", line 264, in execute
save_off(self.properties.path, context)
File "export_off.py", line 244, in save_off
primary.write(file)
File "export_off.py", line 181, in write
variable.write(file)
File "export_off.py", line 118, in write
file.write(self.value)
TypeError: must be bytes or buffer, not str
У меня в основном есть строковый класс, который содержит строку:
class _off_str(object):
__slots__ = 'value'
def __init__(self, val=""):
self.value=val
def get_size(self):
return SZ_SHORT
def write(self,file):
file.write(self.value)
def __str__(self):
return str(self.value)
Кроме того, я называю тот класс как это (где переменная является массивом объектов _off_str:
def write(self, file):
for variable in self.variables:
variable.write(file)
Я понятия не имею, что продолжается. Я видел, что другие программы Python пишут строки в файлы, итак, почему не может этот?
Большое спасибо за Вашу справку.
Править: Похоже, что я должен был заявить, как я открыл файл, вот то, как:
file = open(filename, 'wb')
primary.write(file)
file.close()
Я подозреваю, что вы используете Python 3 и открыли файл в двоичном режиме, который будет принимать только байты или буферы для записи внутрь.
Есть ли шанс увидеть код, открывающий файл для записи?
редактировать: Похоже, это действительно виноват.
Какую версию Python вы используете? В Python 3.x строка содержит текст Unicode без определенной кодировки. Чтобы записать его в поток байтов (файл), вы должны преобразовать его в байтовую кодировку, такую как UTF-8, UTF-16 и т. Д. К счастью, это легко сделать с помощью метода encode ()
:
Python 3.1.1 (...)
>>> s = 'This is a Unicode string'
>>> print(s.encode('utf-8'))
Другой пример, запись UTF-16 в файл:
>>> f = open('output.txt', 'wb')
>>> f.write(s.encode('utf-16'))
Наконец, вы можете использовать «автоматический» текстовый режим Python 3, который будет автоматически преобразовать вашу строчку
в указанную вами кодировку:
>>> f = open('output.txt', 'wt', encoding='utf-8')
>>> f.write(s)
Я не вижу, чтобы вы сначала открывали файл:
file_handler = open(path)
file_handler.write(string)
file_handler.close()
Как вы открыли файл?
Судя по сообщению об ошибке, я предполагаю :
f = open("file", "wb") # b for binary mode
Если вы хотите использовать строки, вы должны использовать :
f = open("file", "w")
Если вы используете "b", файлы ожидают двоичные данные, а вы пишете self.value
, что является строкой.
Кстати, не используйте file
" в качестве имени переменной, так как это скрывает file
встроенного объекта Python.
Я вижу в вашем комментарии вы упомянули, что сделали
file = open('xxx.xxx' ,'wb')
Это означает, что вы открываете файл для записи в двоичном формате (поэтому просто опустите флаг b
).