python: TypeError: невозможно записать str в текстовый поток - PullRequest
20 голосов
/ 22 декабря 2010

Я, должно быть, здесь что-то делаю явно неправильно.Но что это такое и как мне исправить?

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 : в моем реальном приложении не будет постоянной строки, у меня будет обычная строка... если проблема в юникоде, как мне конвертировать в то, что требует io.open?

Ответы [ 5 ]

36 голосов
/ 22 декабря 2010

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

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

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

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

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

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

12 голосов
/ 22 декабря 2010

Попробуйте:

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

Ссылка

5 голосов
/ 22 декабря 2010

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

fq.write(u"bingo")

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

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

Однако запись строки в Юникоде сработала.

4 голосов
/ 22 декабря 2010
f = open("test.txt", "w")
f.write('bingo')
f.close()

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

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

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

2 голосов
/ 22 декабря 2010

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

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

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

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