builtins.TypeError: должно быть str, а не байтами

Я преобразовал свои скрипты из 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 это работает.


person user278618    schedule 01.04.2011    source источник
comment
На самом деле не исследовал это, но быстрое предположение состоит в том, что вы должны открыть файл в двоичном режиме.   -  person Sven Marnach    schedule 01.04.2011
comment
Связано: stackoverflow.com/questions/13906623/ (с библиотекой рассола, а не lxml)   -  person user202729    schedule 19.01.2021


Ответы (2)


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

outFile = open('output.xml', 'wb')
person Lennart Regebro    schedule 01.04.2011
comment
Разум взорван. Python3 переосмыслил, что делать с этой маленькой буквой «b». Раньше он только раздражал пользователей Windows, которые забывали включить его (или не могли, потому что использовали stdio). Теперь он может раздражать пользователей Python на всех платформах. Надеюсь, это того стоит. - person Brent Bradburn; 17.08.2013
comment
Если вы разбираете текст, оно того стоит. - person Lennart Regebro; 16.01.2014
comment
@nobar Требуется, например, отключите универсальную поддержку новой строки, legacy.python.org/dev/peps/pep-0278, который в Python 3 включен по умолчанию. - person user7610; 26.07.2014
comment
У меня работает и в gzip для python3! json.load(gzip.open('file.json.gz')) терпит неудачу, а json.load(gzip.open('file.json.gz', 'rt')) преуспевает! - person hobs; 18.11.2016
comment
@LennartRegebro, нет, если системная настройка неожиданная. Двоичный формат лучше и менее подвержен ошибкам. Если это работает, значит, действительно работает. Что касается текста, всегда есть что, если задействовано. - person Pacerier; 16.02.2017
comment
Я поддерживаю свой предыдущий комментарий. И нет, двоичный файл действительно не работает, если он работает. На самом деле, есть несколько способов скрыть сбой, когда вы работаете с текстом, как если бы он был двоичным. В этом весь смысл типа Unicode / String. - person Lennart Regebro; 28.02.2017

Преобразуйте двоичный файл в 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
person djperalta    schedule 22.04.2017