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를 설치했습니다.

파이썬 2.7에서는 작동합니다.


10
실제로 이것을 조사하지는 않았지만 빠른 추측은 파일을 바이너리 모드로 열어야한다는 것입니다.
Sven Marnach

답변:


484

아웃 파일은 2 진 모드에 있어야합니다.

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

100
마음을 날려. Python3은 작은 'b'로 무엇을해야하는지 다시 생각했습니다. 그것은 그것을 포함하는 것을 잊어 버렸거나 stdio를 사용했기 때문에 Windows 사용자를 성가 시게했습니다. 이제 모든 플랫폼에서 Python 사용자를 성가 시게 할 수 있습니다. 잘만되면, 그것은 고통의 가치가있을 것입니다.
nobar

5
텍스트를 구문 분석하는 경우 확실히 가치가 있습니다.
Lennart Regebro

@nobar 예를 들어 , 파이썬 3에서 기본적으로 켜져있는 일반 개행 지원 인 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'))성공합니다!
호브

@LennartRegebro, 시스템 설정이 예기치 않은 경우 아닙니다. 이진이 가장 좋고 오류가 적습니다. 작동하면 실제로 작동합니다. 텍스트에 관해서는 항상 "what if"가 있습니다.
Pacerier

6

이진 파일을 base64로 변환하거나 그 반대로 변환하십시오. 파이썬 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.