builtins.TypeError: harus str, bukan byte


220

Saya telah mengkonversi skrip saya dari Python 2.7 ke 3.2, dan saya memiliki 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) 

Di baris terakhir, saya mendapatkan kesalahan ini:

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)

Saya telah menginstal Python 3.2, dan saya telah menginstal lxml-2.3.win32-py3.2.exe.

Pada Python 2.7 berfungsi.


10
Tidak benar-benar menyelidiki ini, tetapi tebakan cepat adalah Anda harus membuka file dalam mode biner.
Sven Marnach

Jawaban:


484

File outfile harus dalam mode biner.

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

100
Pikiran meledak. Python3 telah membayangkan kembali apa yang harus dilakukan dengan si kecil 'b'. Dulu hanya mengganggu pengguna Windows yang akan lupa untuk memasukkannya (atau tidak bisa karena mereka menggunakan stdio). Sekarang ini dapat mengganggu pengguna Python di semua platform. Semoga ini akan sebanding dengan rasa sakitnya.
nobar

5
Jika Anda mem-parsing teks, itu pasti sepadan.
Lennart Regebro

@nobar Diperlukan untuk, misalnya, mematikan dukungan Universal baris baru, legacy.python.org/dev/peps/pep-0278 , yang diaktifkan secara default di Python 3
user7610

Bekerja untuk saya di gzip untuk python3 juga! json.load(gzip.open('file.json.gz'))gagal, dan json.load(gzip.open('file.json.gz', 'rt'))berhasil!
hobs

@LennartRegebro, Tidak jika pengaturan sistem tidak terduga. Biner adalah yang terbaik dan lebih sedikit kesalahan rawan. Jika berhasil, itu benar-benar berfungsi. Adapun teks, selalu ada "bagaimana jika" yang terlibat.
Pacerier

6

Konversi file biner ke base64 & sebaliknya. Buktikan dalam 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.