2016-11-30 7 views
0

вот мой код:lxml.objectify ошибка при записи данных

from lxml import etree, objectify 

def parseXML(xmlFile): 
    with open(xmlFile) as f: 
     xml = f.read() 

    root = objectify.fromstring(xml) 

    #returns attributes in element node as dict 
    attrib = root.attrib 

    #how to extract element data 
    begin = root.appointment.begin 
    uid = root.appointment.uid 

    #loop over elements and print their tags and text 
    for appt in root.getchildren(): 
     for e in appt.getchildren(): 
      print('%s => %s' % (e.tag, e.text)) 
     print() 

    #how to change element's text 
    root.appointment.begin = 'something else' 
    print(root.appointment.begin) 

    #how to add a new element 
    root.appointment.new_element = 'new data' 

    #remove the py:pytype stuff 
    objectify.deannotate(root) 
    etree.cleanup_namespaces(root) 
    obj_xml = etree.tostring(root, pretty_print=True) 
    print(obj_xml) 

    #save your xml 
    with open('new.xml', 'w') as f: 
     f.write(obj_xml) 

parseXML('example.xml') 

Здесь обрабатывается XML-файл:

<?xml version="1.0" ?> 
<zAppointments reminder="15"> 
    <appointment> 
     <begin>1181251600</begin> 
     <uid>0400000008200E000</uid> 
     <alarmTime>1181572063</alarmTime> 
     <state></state> 
     <location></location> 
     <duration>1800</duration> 
     <subject>Bring pizza home</subject> 
    </appointment> 
    <appointment> 
     <begin>1234567890</begin> 
     <duration>1800</duration> 
     <subject>Check MS office webstie for updates</subject> 
     <state>dismissed</state> 
     <location></location> 
     <uid>502fq14-12551ss-255sf2</uid> 
    </appointment> 
</zAppointments> 

А вот выход с ошибкой:

/usr/bin/python3.5 "/home/michal/Desktop/nauka programowania/python 101/parsing_with_lxml.py" 
begin => 1181251600 
uid => 0400000008200E000 
Traceback (most recent call last): 
alarmTime => 1181572063 
    File "/home/michal/Desktop/nauka programowania/python 101/parsing_with_lxml.py", line 87, in <module> 
state => None 
location => None 
    parseXML('example.xml') 
duration => 1800 
subject => Bring pizza home 

begin => 1234567890 
duration => 1800 
subject => Check MS office webstie for updates 
state => dismissed 
location => None 
uid => 502fq14-12551ss-255sf2 

something else 
b'<zAppointments reminder="15">\n <appointment>\n <begin>something else</begin>\n <uid>0400000008200E000</uid>\n <alarmTime>1181572063</alarmTime>\n <state/>\n <location/>\n <duration>1800</duration>\n <subject>Bring pizza home</subject>\n <new_element>new data</new_element>\n </appointment>\n <appointment>\n <begin>1234567890</begin>\n <duration>1800</duration>\n <subject>Check MS office webstie for updates</subject>\n <state>dismissed</state>\n <location/>\n <uid>502fq14-12551ss-255sf2</uid>\n </appointment>\n</zAppointments>\n' 
    File "/home/michal/Desktop/nauka programowania/python 101/parsing_with_lxml.py", line 85, in parseXML 
    f.write(obj_xml) 
TypeError: write() argument must be str, not bytes 

Process finished with exit code 1 

Что я могу сделать, чтобы превратить этот объект f в строку? Возможно ли это? Я получил эту ошибку несколько раз раньше и до сих пор не знаю, как ее исправить (выполняя упражнения Python 101).

ответ

0

obj_xml - это тип байтов, поэтому он не может использовать его с write() без его декодирования. Нужно изменить

f.write(obj_xml) 

к:

f.write(obj_xml.decode('utf-8')) 

И это работает!