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.