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.


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')

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.