Python: TypeError: не удается записать str в текстовый поток

Я должен делать что-то явно не так. Но что это такое и как я могу исправить?

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import io
>>> f1 = io.open('test.txt','w')
>>> f1.write('bingo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\appl\python\2.6.5\lib\io.py", line 1500, in write
    s.__class__.__name__)
TypeError: can't write str to text stream

edit. В моем реальном приложении у меня не будет постоянной строки, у меня будет регулярная строка... если unicode - проблема, как мне преобразовать в то, что io. open требуется?

Ответ 1

Модуль io представляет собой довольно новый модуль python (представленный в Python 2.6), что упрощает работу с файлами в формате unicode. Его документация находится по адресу: http://docs.python.org/library/io.html

Если вы просто хотите писать байты (тип Python 2 "str" ) в отличие от текста (тип "Юникод" Python 2), я бы рекомендовал вам либо пропустить модуль io, и просто использовать встроенный "открытая" функция, которая дает объект файла, который имеет дело с байтами:

>>> f1 = open('test.txt','w')

Или, используйте 'b' в строке режима, чтобы открыть файл в двоичном режиме:

>>> f1 = io.open('test.txt','wb')

Подробнее читайте документы для модуля io: http://docs.python.org/library/io.html

Ответ 2

Попробуйте:

>>> f1.write(u'bingo')      # u specifies unicode

Ссылка

Ответ 3

Пробовали ли вы писать строку Unicode, а не только str? То есть.

fq.write(u"bingo")

Я нахожусь в Mac OS X, но когда я попытался написать str, я получил ошибку

TypeError: должен быть unicode, а не str

Написание строки Unicode работало, однако.

Ответ 4

f = open("test.txt", "w")
f.write('bingo')
f.close()

эквивалентно,

with open("test.txt", "w") as f:
    f.write('bingo')

и завершение блока закрывает файл для вас.

Ответ 5

Модуль io отличается от старого открытого тем, что он будет иметь большое значение между двоичными и текстовыми файлами. Если вы откроете файл в текстовом режиме, чтение вернет текстовые объекты Unicode (называемые unicode в Python 2 и str в Python 3), и для записи требуется, чтобы вы также передавали объекты unicode.

Если вы откроете в двоичном режиме, вы получите 8-битные последовательные данные и это то, что вам нужно написать. В Python 2 для этого используется str, в Python 3 bytes.

Вы используете Python 2 и пытаетесь записать str в файл, открытый в текстовом режиме. Это не сработает. Используйте Unicode.