Запись строк в файлы в Python - PullRequest
10 голосов
/ 22 марта 2010

При попытке записать строку в файл в pythion я получаю следующую ошибку:

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()

Ответы [ 5 ]

18 голосов
/ 22 марта 2010

Какую версию 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, который автоматически преобразует ваш str в указанную вами кодировку:

>>> f = open('output.txt', 'wt', encoding='utf-8')
>>> f.write(s)
8 голосов
/ 22 марта 2010

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

Есть ли шанс увидеть код, который открывает файл для записи?


edit: Похоже, это действительно преступник.

2 голосов
/ 22 марта 2010

Я не вижу, чтобы вы открывали файл первым:

file_handler = open(path)
file_handler.write(string)
file_handler.close()
1 голос
/ 22 марта 2010

Я вижу в вашем комментарии вы упомянули, что вы сделали

file = open('xxx.xxx' ,'wb')

Это означает, что вы открываете файл для записи в двоичном формате (поэтому просто пропустите флаг b).

0 голосов
/ 22 марта 2010

Как вы открыли файл?

По сообщению об ошибке я угадаю:

f = open("file", "wb") # b for binary mode

Если вы хотите использовать строки, вы должны использовать:

f = open("file", "w") 

Если вы используете «b», файлы будут ожидать двоичные данные, а вы пишете self.value, что является строкой.

Кстати, не используйте file "в качестве имени переменной, поскольку оно скрывает встроенный объект file Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...