builtins.TypeError:必须是 str,而不是 bytes

Posted

技术标签:

【中文标题】builtins.TypeError:必须是 str,而不是 bytes【英文标题】:builtins.TypeError: must be str, not bytes 【发布时间】:2011-07-27 15:15:44 【问题描述】:

我已将我的脚本从 Python 2.7 转换为 3.2,但我遇到了一个错误。

# -*- coding: utf-8 -*-
import time
from datetime import date
from lxml import etree
from collections import OrderedDict

# Create the root element
page = etree.Element('results')

# Make a new document tree
doc = etree.ElementTree(page)

# Add the subelements
pageElement = etree.SubElement(page, 'Country',Tim = 'Now', 
                                      name='Germany', AnotherParameter = 'Bye',
                                      Code='DE',
                                      Storage='Basic')
pageElement = etree.SubElement(page, 'City', 
                                      name='Germany',
                                      Code='PZ',
                                      Storage='Basic',AnotherParameter = 'Hello')
# For multiple multiple attributes, use as shown above

# Save to XML file
outFile = open('output.xml', 'w')
doc.write(outFile) 

在最后一行,我得到了这个错误:

builtins.TypeError: must be str, not bytes
File "C:\PythonExamples\XmlReportGeneratorExample.py", line 29, in <module>
  doc.write(outFile)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 1853, in lxml.etree._ElementTree.write (src/lxml/lxml.etree.c:44355)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 478, in lxml.etree._tofilelike (src/lxml/lxml.etree.c:90649)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 282, in lxml.etree._ExceptionContext._raise_if_stored (src/lxml/lxml.etree.c:7972)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 378, in lxml.etree._FilelikeWriter.write (src/lxml/lxml.etree.c:89527)

我已经安装了 Python 3.2,并且我已经安装了 lxml-2.3.win32-py3.2.exe。

在 Python 2.7 上它可以工作。

【问题讨论】:

并没有真正研究这个,但快速猜测是您应该以二进制模式打开文件。 相关:***.com/questions/13906623/…(使用 pickle 库,而不是 lxml) 【参考方案1】:

outfile 应该是二进制模式。

outFile = open('output.xml', 'wb')

【讨论】:

大吃一惊。 Python3 重新构想了如何处理那个小“b”。它过去只会惹恼那些忘记包含它的 Windows 用户(或者因为他们正在使用 stdio 而不能包含它)。现在它可以在所有平台上惹恼 Python 用户。希望这是值得的痛苦。 如果您正在解析文本,那绝对值得。 @nobar 它是必需的,例如关闭通用换行支持,legacy.python.org/dev/peps/pep-0278,在 Python 3 中默认开启 在 gzip for python3 中也适用于我! json.load(gzip.open('file.json.gz')) 失败,json.load(gzip.open('file.json.gz', 'rt')) 成功! @LennartRegebro,如果系统设置异常,则不会。二进制是最好的并且不易出错。如果它有效,它确实有效。至于文字,总有一个“假设”。【参考方案2】:

将二进制文件转换为 base64,反之亦然。在 python 3.5.2 中证明

import base64

read_file = open('/tmp/newgalax.png', 'rb')
data = read_file.read()

b64 = base64.b64encode(data)

print (b64)

# Save file
decode_b64 = base64.b64decode(b64)
out_file = open('/tmp/out_newgalax.png', 'wb')
out_file.write(decode_b64)

# Test in python 3.5.2

【讨论】:

以上是关于builtins.TypeError:必须是 str,而不是 bytes的主要内容,如果未能解决你的问题,请参考以下文章

我如何以python不将数据解释为unicode的方式编写它?

股票撤销st申请多长时间批复?

股票撤销st申请多长时间批复?

股票撤销st申请多长时间批复?

股票撤销st申请多长时间批复?

count():参数必须是数组或者是laravel中实现Countable的对象