Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2014 20:31:44

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

добавить объявление типа xml-документа

помогите пожалуйста понять как в python3 добавляется объявление типа документа в xml-файл

например есть такая функция

def record_xml(xml, fileName='qwerty.xml'):
    try:
        with open(fileName, "wt") as file:
            file.write(xml)
    except OSError:
        print('Error')
    else:
        return True
record_xml(xmlPretty)

она записывает в текстовый файл примерно такое:
<data>
  <item>
    <message>что с браузером</message>
    <section>Взаимопомощь</section>
    <date>05.07.2013</date>
  </item>
...............
.....

но мне нужно, чтобы она записывала примерно такое:
<?_xml version="1.0" encoding="utf-8"?>
<data>
  <item>
    <message>что с браузером</message>
    <section>Взаимопомощь</section>
    <date>05.07.2013</date>
  </item>
...............
.....

в python2 это делается без проблем так:
xmlPretty = etree.tostring(tree, pretty_print=True, xml_declaration=True,  encoding='utf-8')

но в python3 вместо etree.tostring используется etree.tounicode и она не имеет аргумента xml_declaration. (при попытке использовать этот аргумент получаю сообщение об ошибке)

на stackoverflow говорят, что во 2 и 3 питоне нужно использовать etree.tostring

Отредактировано zlodiak (Март 8, 2014 20:33:59)

Офлайн

#2 Март 9, 2014 13:19:45

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

zlodiak
но в python3 вместо etree.tostring используется etree.tounicode

Python 3.3.2+

>>> import lxml.etree as e
>>> h = e.Element('html')
>>> e.tostring(h, encoding='utf-8', xml_declaration=True)
b"<?xml version='1.0' encoding='utf-8'?>\n<html/>"

для записи байтов, нужно открыть файл ‘wb’

или так

>>> xml_declaration = '<?_xml version="1.0" encoding="utf-8"?>'
>>> fout.write(e.tounicode(h, doctype=xml_declaration))

zlodiak
etree.tounicode и она не имеет аргумента xml_declaration
Дело в том, что в юникоде нет смысла вставлять такую строку, которая имеет отношение к кодировке, поэтому такого параметра в etree.tounicode нет.



Отредактировано Budulianin (Март 9, 2014 14:16:32)

Офлайн

#3 Март 9, 2014 14:17:44

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

добавить объявление типа xml-документа

в python 3/3/3 заработал такой вариант…

import lxml.etree
def record_xml_to_file(xml, xml_declaration, fileName='qw.xml'):
    xmlPretty = lxml.etree.tounicode(xml, pretty_print=True)
    print(xmlPretty)
    
    try:
        with open(fileName, "wb") as file:
            #file.write(lxml.etree.tounicode(xml, doctype=xml_declaration))
            file.write(bytes(lxml.etree.tounicode(xml, doctype=xml_declaration), 'UTF-8'))
    except OSError as exc:
        print('Error record. ', exc)
    else:
        return True
        
        
xml_declaration = '<?xml version="1.0" encoding="utf-8"?>'        
xml = lxml.etree.Element('html')
record_xml_to_file(xml, xml_declaration)

Отредактировано zlodiak (Март 9, 2014 14:19:33)

Офлайн

#4 Март 9, 2014 14:46:14

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

zlodiak

tounicode вообще считается устаревшей

fout.write(
    os.linesep.join([
        xml_declaration,
        etree.tostring(
            xml,
            encoding='unicode',
        ),
    ])
)



Отредактировано Budulianin (Март 9, 2014 15:24:00)

Офлайн

#5 Март 9, 2014 15:18:32

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

добавить объявление типа xml-документа


Офлайн

#6 Март 9, 2014 15:22:15

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

zlodiak

Тебе же интерпретатор почти по-русски написал

Не используй табы для отступов, только 4 пробела

open('output.txt', 'w'



Отредактировано Budulianin (Март 9, 2014 15:26:47)

Офлайн

#7 Март 9, 2014 15:24:15

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

Budulianin
почти по-русски
такая уже маленькая разница ?

Офлайн

#8 Март 9, 2014 15:27:26

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

Singularity

Это тот бендер на аватаре спрашивает?



Офлайн

#9 Март 9, 2014 15:40:12

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

добавить объявление типа xml-документа

ребят, я всё равно не понимаю, поясните пожалуйста. табы заменил напробелы, теперь получаю такое сообщение:


Traceback (most recent call last):
File “q.py”, line 20, in <module>
record_xml_to_file(xml, xml_declaration)
File “q.py”, line 10, in record_xml_to_file
file.write('\n'.join([xml_declaration, lxml.
code',),]))
TypeError: ‘str’ does not support the buffer int
Для продолжения нажмите любую клавишу . . .

Отредактировано zlodiak (Март 9, 2014 15:40:28)

Офлайн

#10 Март 9, 2014 15:47:33

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

добавить объявление типа xml-документа

zlodiak
TypeError: ‘str’ does not support the buffer int

если ты открыл файл в текстовом режиме, то тебе нужно передавать в функцию юникод, если в бинарном ‘wb’, то байты

А ты открыл в ‘wb’ и передаёшь юникод

fout = open('output.txt', 'wb')
fout.write('asdasd')
TypeError: str does not support the buffer int


with open(fileName, 'w', encoding='utf-8') as fout:
    fout.write(
        os.linesep.join([
            xml_declaration,
            etree.tostring(
                xml,
                encoding='unicode',
            ),
        ])
    )



Отредактировано Budulianin (Март 9, 2014 16:00:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version