Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Element Tree Writing to New File

Hi so I've been struggling with this and can't quite figure out why I'm getting errors. Trying to export just some basic XML into a new file, keeps giving me a TypeError. Below is a small sample of the code

from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
import xml.etree.ElementTree as ET


root = Element('QuoteWerksXML')
tree = ElementTree(root)
ver = SubElement(root, "AppVersionMajor")
ver.text = '5.1'

tree.write(open('person.xml', 'w'))
like image 279
Kyle Zimmerman Avatar asked Jun 08 '16 21:06

Kyle Zimmerman


People also ask

What is Etree in Python?

The xml.etree.ElementTree module implements a simple and efficient API for parsing and creating XML data. Changed in version 3.3: This module will use a fast implementation whenever available.

How do you process XML in Python?

To read an XML file using ElementTree, firstly, we import the ElementTree class found inside xml library, under the name ET (common convension). Then passed the filename of the xml file to the ElementTree. parse() method, to enable parsing of our xml file. Then got the root (parent tag) of our xml file using getroot().


1 Answers

The ElementTree.write method defaults to us-ascii encoding and as such expects a file opened for writing binary:

The output is either a string (str) or binary (bytes). This is controlled by the encoding argument. If encoding is "unicode", the output is a string; otherwise, it’s binary. Note that this may conflict with the type of file if it’s an open file object; make sure you do not try to write a string to a binary stream and vice versa.

So either open the file for writing in binary mode:

with open('person.xml', 'wb') as f:
    tree.write(f)

or open the file for writing in text mode and give "unicode" as encoding:

with open('person.xml', 'w') as f:
    tree.write(f, encoding='unicode')

or open the file for writing in binary mode and pass an explicit encoding:

with open('person.xml', 'wb') as f:
    tree.write(f, encoding='utf-8')
like image 168
Ilja Everilä Avatar answered Sep 16 '22 15:09

Ilja Everilä