builtins.TypeError: muss str sein, keine Bytes

220

Ich habe meine Skripte von Python 2.7 auf 3.2 konvertiert und habe einen Fehler.

# -*- 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) 

In der letzten Zeile habe ich diesen Fehler erhalten:

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)

Ich habe Python 3.2 installiert und lxml-2.3.win32-py3.2.exe installiert.

Unter Python 2.7 funktioniert es.

user278618
quelle
10
Ich habe das nicht wirklich untersucht, aber eine schnelle Vermutung ist, dass Sie die Datei im Binärmodus öffnen sollten.
Sven Marnach

Antworten:

483

Die Outfile sollte sich im Binärmodus befinden.

outFile = open('output.xml', 'wb')
Lennart Regebro
quelle
100
Verblüfft. Python3 hat sich überlegt, was mit diesem kleinen 'b' zu tun ist. Früher ärgerte es nur Windows-Benutzer, die vergessen hatten, es einzuschließen (oder es nicht konnten, weil sie stdio verwendeten). Jetzt kann es Python-Benutzer auf allen Plattformen nerven. Hoffentlich ist es den Schmerz wert.
Nobar
5
Wenn Sie Text analysieren, lohnt es sich auf jeden Fall.
Lennart Regebro
@nobar Es ist erforderlich, z. B. die universelle Newline-Unterstützung zu deaktivieren, Legacy.python.org/dev/peps/pep-0278 , die in Python 3 standardmäßig aktiviert ist
user7610
Funktioniert bei mir auch in gzip für python3! json.load(gzip.open('file.json.gz'))scheitert und ist json.load(gzip.open('file.json.gz', 'rt'))erfolgreich!
Kochfelder
@LennartRegebro, Nicht wenn die Systemeinstellung unerwartet ist. Binär ist am besten und weniger fehleranfällig. Wenn es funktioniert, funktioniert es wirklich. Was den Text betrifft, gibt es immer ein "Was wäre wenn".
Pacerier
6

Konvertieren Sie die Binärdatei in base64 und umgekehrt. Beweisen Sie in 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
djperalta
quelle