builtins.TypeError:バイトではなくstrである必要があります


220

スクリプトを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では動作します。


10
これは実際には調査しませんでしたが、簡単に推測すると、バイナリモードでファイルを開く必要があります。
Sven Marnach、2011

回答:


483

出力ファイルはバイナリモードである必要があります。

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

100
吹き飛ばされた心。Python3は、その小さな「b」をどうするかを再考しました。これを含めるのを忘れる(またはstdioを使用していたためにできなかった)Windowsユーザーを困らせるだけでした。今では、すべてのプラットフォームでPythonユーザーを困らせることができます。うまくいけば、それは痛みの価値があるでしょう。
nobar 2013

5
テキストを解析する場合は、間違いなく価値があります。
Lennart Regebro 2014年

@nobarたとえば、Python 3でデフォルトでオンになっているUniversal newlineサポート、legacy.python.org/dev/peps/pep-0278をオフにする必要があります
user7610

python3のgzipでも動作します!json.load(gzip.open('file.json.gz'))失敗し、json.load(gzip.open('file.json.gz', 'rt'))成功します!
ホブ、2016年

@LennartRegebro、システム設定が予想外の場合は不可。バイナリが最善であり、エラーが発生しにくくなります。それが機能する場合、それは本当に機能します。テキストに関しては、常に「もしも」が関わっています。
パセリエ2017

6

バイナリファイルを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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.