buildins.TypeError: phải là str, không phải byte


220

Tôi đã chuyển đổi tập lệnh của mình từ Python 2.7 sang 3.2 và tôi gặp lỗi.

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

Trên dòng cuối cùng, tôi đã gặp lỗi này:

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)

Tôi đã cài đặt Python 3.2 và tôi đã cài đặt lxml-2.3.win32-py3.2.exe.

Trên Python 2.7 nó hoạt động.


10
Không thực sự điều tra điều này, nhưng một phỏng đoán nhanh là bạn nên mở tệp ở chế độ nhị phân.
Sven Marnach

Câu trả lời:


483

Outfile nên ở chế độ nhị phân.

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

100
Tâm thổi. Python3 đã mô phỏng lại những việc cần làm với 'b' nhỏ đó. Nó được sử dụng để chỉ làm phiền người dùng Windows, những người sẽ quên bao gồm nó (hoặc không thể vì họ đang sử dụng stdio). Bây giờ nó có thể gây khó chịu cho người dùng Python trên tất cả các nền tảng. Hy vọng, nó sẽ có giá trị nỗi đau.
tộc

5
Nếu bạn đang phân tích văn bản, nó chắc chắn có giá trị.
Lennart Regebro

@nobar Yêu cầu ví dụ: tắt hỗ trợ dòng mới Toàn cầu, legacy.python.org/dev/peps/pep-0278 , được bật theo mặc định trong Python 3
user7610

Làm việc cho tôi trong gzip cho python3 quá! json.load(gzip.open('file.json.gz'))thất bại, và json.load(gzip.open('file.json.gz', 'rt'))thành công!
hobs

@LennartRegebro, Không nếu cài đặt hệ thống bất ngờ. Nhị phân là tốt nhất và ít bị lỗi. Nếu nó hoạt động nó thực sự làm việc. Đối với văn bản, luôn có một "nếu như" liên quan.
Pacerier

6

Chuyển đổi tệp nhị phân sang base64 & ngược lại. Chứng minh trong trăn 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.