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 это работает.

user278618
источник
10
На самом деле не исследовал это, но можно догадаться, что вы должны открыть файл в двоичном режиме.
Свен Марнах

Ответы:

486

Выходной файл должен быть в двоичном режиме.

outFile = open('output.xml', 'wb')
Леннарт Регебро
источник
100
Разум взорван. Python3 переосмыслил, что делать с этим маленьким «b». Раньше это раздражало только пользователей Windows, которые забыли включить его (или не могли, потому что они использовали stdio). Теперь это может раздражать пользователей Python на всех платформах. Надеюсь, это будет стоить боли.
Нобар
5
Если вы анализируете текст, это определенно стоит того.
Леннарт Регебро
@nobar Требуется, например, отключить универсальную поддержку новой строки, legacy.python.org/dev/peps/pep-0278 , которая по умолчанию
включена
У меня тоже работает в 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
djperalta
источник