296

I've converted my scripts from Python 2.7 to 3.2, and I have a bug.

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

On the last line, I got this error:

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)

I've installed Python 3.2, and I've installed lxml-2.3.win32-py3.2.exe.

On Python 2.7, it works.

2
  • 16
    Did not really investigate this, but a quick guess is that you should open the file in binary mode. Commented Apr 1, 2011 at 11:39
  • Related: stackoverflow.com/questions/13906623/… (with the pickle library, not lxml) Commented Jan 19, 2021 at 14:33

3 Answers 3

657

The outfile should be in binary mode.

outFile = open('output.xml', 'wb')
Sign up to request clarification or add additional context in comments.

8 Comments

Mind blown. Python3 has reimagined what to do with that little 'b'. It used to only annoy Windows users who would forget to include it (or couldn't because they were using stdio). Now it can annoy Python users on all platforms. Hopefully, it will be worth the pain.
If you are parsing text it is definitely worth it.
@nobar It is required to e.g. switch off Universal newline support, legacy.python.org/dev/peps/pep-0278 , which is on by default in Python 3
Works for me in gzip for python3 too! json.load(gzip.open('file.json.gz')) fails, and json.load(gzip.open('file.json.gz', 'rt')) succeeds!
@LennartRegebro, Not if the system setting is unexpected. Binary is best and less error prone. If it works it really does work. As for text, there's always a "what if" involved.
|
9

Convert binary file to base64 & vice versa. Prove in 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

Comments

0

If for whatever reason, the output file was opened with mode='w' and cannot be reopened with 'wb', a workaround is to access .buffer on the TextIOWrapper to create a BufferedWriter (which is instantiated if a file was opened with mode='wb') and write.

s = """
<country name="Liechtenstein">
    <year>2008</year>
    <gdppc>141100</gdppc>
</country>
"""
import xml.etree.ElementTree as ET
doc = ET.ElementTree(ET.fromstring(s))

outFile = open('output.xml', 'w')
doc.write(outFile.buffer)             # <--- buffer here
outFile.close()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.