builtins.TypeError: bayt değil str olmalı


220

Senaryolarımı Python 2.7'den 3.2'ye dönüştürdüm ve bir hata var.

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

Son satırda şu hatayı aldım:

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)

Python 3.2'yi yükledim ve lxml-2.3.win32-py3.2.exe'yi yükledim.

Python 2.7'de çalışır.


10
Bunu gerçekten araştırmadım, ancak hızlı bir tahmin, dosyayı ikili modda açmanız gerektiğidir.
Sven Marnach

Yanıtlar:


484

Dosya ikili modda olmalıdır.

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

100
Zihin karmaşası. Python3 bu küçük 'b' ile ne yapılacağını yeniden tasarladı. Yalnızca dahil etmeyi unutan (veya stdio kullandıkları için yapamayan) Windows kullanıcılarını rahatsız ederdi. Artık Python kullanıcılarını tüm platformlarda rahatsız edebilir. Umarım, acıya değecektir.
nobar

5
Metin ayrıştırıyorsanız kesinlikle buna değer.
Lennart Regebro

@nobar Örneğin Python 3'te varsayılan olarak açık olan Universal newline desteğini, legacy.python.org/dev/peps/pep-0278 kapatmak gerekir
user7610 26:14

Python3 için gzip de benim için çalışıyor! json.load(gzip.open('file.json.gz'))başarısız ve json.load(gzip.open('file.json.gz', 'rt'))başarılı!
ocaklar

@LennartRegebro, Sistem ayarı beklenmedikse değil. İkili en iyi ve daha az hata eğilimli. Eğer işe yarıyorsa gerçekten işe yarıyor. Metin gelince, her zaman bir "eğer" dahil.
Pacerier

6

İkili dosyayı base64 ve tersine dönüştürün. Python 3.5.2'de kanıtlayın

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.