【问题标题】:python: TypeError: can't write str to text streampython:TypeError:无法将str写入文本流
【发布时间】:2011-05-29 14:50:16
【问题描述】:

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

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.打开需要?

【问题讨论】:

标签: python io


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试:

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

    Reference

    【讨论】:

    • 这“修复”了它,但是如果我有一个来自某个地方的常规字符串,我该怎么办?
    • unicode(s) 会将您的字节字符串(常规字符串)转换为 Unicode 字符串。
    • 如果 Jason 有一个非 ascii 字节字符串,那么 unicode(s) 只会引发异常。如果他正在处理字节(而不是 unicode aka text),那么他可能最好使用处理字节的文件对象——f=open('file','w')f=io.open('file', 'wb')
    【解决方案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')
      

      块的终止会为你关闭文件。

      【讨论】:

      • 嗯。除了编辑cmets,io.openopen有什么区别?
      • >>> io.open("testdata.txt", "w")
      • >>> open("testdata.txt", "w")
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2017-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多