builtins.TypeError: deve essere str, non byte


220

Ho convertito i miei script da Python 2.7 a 3.2 e ho un bug.

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

Nell'ultima riga, ho ricevuto questo errore:

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)

Ho installato Python 3.2 e ho installato lxml-2.3.win32-py3.2.exe.

Su Python 2.7 funziona.


10
Non ho davvero indagato su questo, ma una rapida ipotesi è che dovresti aprire il file in modalità binaria.
Sven Marnach,

Risposte:


486

Il file di output dovrebbe essere in modalità binaria.

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

100
Sbalordire. Python3 ha reinventato cosa fare con quella piccola "b". Era solo seccante per gli utenti di Windows che si sarebbero dimenticati di includerlo (o non potevano perché stavano usando stdio). Ora può infastidire gli utenti Python su tutte le piattaforme. Speriamo che varrà la pena.
nobar,

5
Se stai analizzando il testo, ne vale sicuramente la pena.
Lennart Regebro,

@nobar È necessario, ad esempio, disattivare il supporto di newline universale, legacy.python.org/dev/peps/pep-0278 , che è attivo per impostazione predefinita in Python 3
user7610

Funziona anche con me in gzip per python3! json.load(gzip.open('file.json.gz'))fallisce e ci json.load(gzip.open('file.json.gz', 'rt'))riesce!
Piani cottura

@LennartRegebro, No se l'impostazione del sistema non è prevista. Il binario è il migliore e meno soggetto a errori. Se funziona, funziona davvero. Per quanto riguarda il testo, c'è sempre un "what if" coinvolto.
Pacerier,

6

Converti file binario in base64 e viceversa. Dimostrare 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.