builtins.TypeError: ต้องเป็น str ไม่ใช่ไบต์


220

ฉันได้แปลงสคริปต์ของฉันจาก Python 2.7 เป็น 3.2 และฉันมีข้อบกพร่อง

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

ในบรรทัดสุดท้ายฉันได้รับข้อผิดพลาดนี้:

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 และฉันติดตั้ง lxml-2.3.win32-py3.2.exe

ใน Python 2.7 มันใช้งานได้


10
ไม่ได้ตรวจสอบสิ่งนี้จริงๆ แต่การคาดเดาอย่างรวดเร็วคือคุณควรเปิดไฟล์ในโหมดไบนารี
Sven Marnach

คำตอบ:


484

outfile ควรอยู่ในโหมดไบนารี

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

100
ใจเป่า Python3 ได้คิดใหม่อีกครั้งว่าจะทำอย่างไรกับ 'b' ตัวน้อย มันเคยรบกวนผู้ใช้ Windows ที่จะลืมที่จะรวมไว้ (หรือไม่สามารถทำได้เพราะใช้ stdio) ตอนนี้มันสามารถรบกวนผู้ใช้ Python ในทุกแพลตฟอร์ม หวังว่ามันจะคุ้มค่ากับความเจ็บปวด
โนเบิล

5
หากคุณแยกวิเคราะห์ข้อความมันจะคุ้มค่าแน่นอน
Lennart Regebro

@nobar จำเป็นต้องมีเช่นปิดการสนับสนุน Universal newline, legacy.python.org/dev/peps/pep-0278ซึ่งเปิดใช้งานโดยค่าเริ่มต้นใน Python 3
user7610

ใช้งานได้กับฉันใน gzip สำหรับ python3 ด้วยเช่นกัน! json.load(gzip.open('file.json.gz'))ล้มเหลวและjson.load(gzip.open('file.json.gz', 'rt'))ประสบความสำเร็จ!
เตาแก๊ส

@LennartRegebro ไม่ว่าการตั้งค่าระบบจะไม่คาดคิดหรือไม่ ไบนารีดีที่สุดและมีข้อผิดพลาดน้อยลง ถ้ามันใช้งานได้จริงมันใช้งานได้จริง สำหรับข้อความมี "สิ่งที่ถ้า" ที่เกี่ยวข้อง
Pacerier

6

แปลงไฟล์ไบนารีเป็น base64 และในทางกลับกัน พิสูจน์ด้วย 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.