python:TypeError:无法将str写入文本流

时间:2010-12-22 19:36:00

标签: python io

我必须在这里做一些明显错误的事情。但它是什么,我该如何解决?

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

编辑:在我真实的应用程序中,我没有常量字符串,我将有一个常规字符串...如果unicode是问题,我该如何转换为io。开放要求?

5 个答案:

答案 0 :(得分:36)

io模块是一个相当新的python模块(在Python 2.6中引入),可以更轻松地处理unicode文件。其文档位于:http://docs.python.org/library/io.html

如果你只想写字节(Python 2的“str”类型)而不是文本(Python 2的“unicode”类型),那么我建议你跳过io模块,然后使用内置的“open”函数,它提供一个处理字节的文件对象:

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

或者,在模式字符串中使用'b'以二进制模式打开文件:

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

阅读io模块的文档以获取更多详细信息:http://docs.python.org/library/io.html

答案 1 :(得分:12)

尝试:

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

Reference

答案 2 :(得分:5)

您是否尝试过编写Unicode字符串,而不仅仅是str?即,

fq.write(u"bingo")

我在Mac OS X上,但当我尝试编写str时,我收到了错误

  

TypeError:必须是unicode,而不是str

但是,写一个Unicode字符串是有效的。

答案 3 :(得分:4)

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

等价地,

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

并且块的终止会为您关闭文件。

答案 4 :(得分:2)

io模块与旧版本的不同之处在于它会在二进制文件和文本文件之间产生很大的差异。如果在文本模式下打开文件,则读取将返回Unicode文本对象(在Python 2中称为unicode,在Python 3中称为str)并且写入也要求您为其提供unicode对象。

如果以二进制模式打开,您将获得8位顺序数据,这就是您需要编写的内容。在Python 2中,您可以在Python 3 str中使用bytes

您正在使用Python 2,并尝试将str写入以文本模式打开的文件。那不会奏效。使用Unicode。