Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2017 12:01:32

murdenis1
Зарегистрирован: 2017-03-30
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

есть такой код
etree.SubElement(specifications, “specification”, attrib={'article': str(article), ‘characteristic’: str(characteristic) })
опытным путем определил, что если длина строки article больше 1500000, то в xml-файл строка попадает не полностью, или вовсе не попадает.

Кто-нибудь знает, что с этим можно сделать? (строки могут быть и больше 1500000)

Офлайн

#2 Март 30, 2017 14:28:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

Надо содержимое отдельно хранить, а в xml только ссылку на него.

А вообще всё помещается

  
>>> import xml.etree.ElementTree as etree
>>> 
>>> s = 'a' * 1000 * 1500
>>> 
>>> len(s)
1500000
>>> 
>>> node = etree.Element('a', {'s': s})
>>> 
>>> len(node.attrib['s'])
1500000
>>>
Запись в файл тоже проверил.



Отредактировано py.user.next (Март 30, 2017 14:28:58)

Офлайн

#3 Март 31, 2017 07:44:58

murdenis1
Зарегистрирован: 2017-03-30
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

py.user.next
Надо содержимое отдельно хранить, а в xml только ссылку на него.А вообще всё помещается

если таким образом пишу в файл, то все выводит
xml_file.write(etree.tounicode(specifications, pretty_print=True))

если таким - то обрезает строки
xml_file.write(etree.tostring(specifications, pretty_print=True, encoding='WINDOWS-1251', xml_declaration=True).decode('cp1251'))

Офлайн

#4 Март 31, 2017 10:00:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

Приведи код, в котором читаешь из файла и пишешь в файл.



Офлайн

#5 Март 31, 2017 11:25:39

murdenis1
Зарегистрирован: 2017-03-30
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

py.user.next
Приведи код, в котором читаешь из файла и пишешь в файл.
from lxml import etree

article = ‘a’*1000*1500

specifications = etree.Element('specifications')
specification = etree.SubElement(specifications, “specification”, attrib={'article': str(article)})

filexml = file_dir+ ‘\\’ + ‘SpecArticle.xml’
xml_file = open(filexml, ‘w’)

xml_file.write(etree.tostring(specifications, pretty_print=True, encoding='WINDOWS-1251', xml_declaration=True).decode('cp1251'))
xml_file.close()

Офлайн

#6 Март 31, 2017 12:38:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

etree.SubElement - есть ли ограничения на размер передаваемой строки?

  
>>> from lxml import etree
>>> 
>>> article = 'я' * 1000 * 1500
>>> 
>>> root = etree.Element('root')
>>> elem = etree.SubElement(root, 'a', attrib={'article': article})
>>> 
>>> etree.ElementTree(root).write('file.xml', encoding='cp1251', xml_declaration=True)
>>>

[guest@localhost xmllong]$ head -c100 file.xml
<?xml version='1.0' encoding='CP1251'?>
<root><a article="������������������������������������������[guest@localhost xmllong]$
[guest@localhost xmllong]$
[guest@localhost xmllong]$ head -c100 file.xml | .hex
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 27 31 |<?xml version='1|
00000010 2e 30 27 20 65 6e 63 6f 64 69 6e 67 3d 27 43 50 |.0' encoding='CP|
00000020 31 32 35 31 27 3f 3e 0a 3c 72 6f 6f 74 3e 3c 61 |1251'?>.<root><a|
00000030 20 61 72 74 69 63 6c 65 3d 22 ff ff ff ff ff ff | article="......|
00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000060 ff ff ff ff |....|
00000064
[guest@localhost xmllong]$
[guest@localhost xmllong]$ wc file.xml
1 5 196637 file.xml
[guest@localhost xmllong]$
Действительно, в lxml обрезает.

Если же заменить на станадартный модуль xml, то всё нормально.
  
>>> import xml.etree.ElementTree as etree
>>> 
>>> article = 'я' * 1000 * 1500
>>> 
>>> root = etree.Element('root')
>>> elem = etree.SubElement(root, 'a', attrib={'article': article})
>>> 
>>> etree.ElementTree(root).write('file.xml', encoding='cp1251', xml_declaration=True)
>>>

[guest@localhost xmllong]$ head -c100 file.xml
<?xml version='1.0' encoding='cp1251'?>
<root><a article="������������������������������������������[guest@localhost xmllong]$
[guest@localhost xmllong]$
[guest@localhost xmllong]$ head -c100 file.xml | .hex
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 27 31 |<?xml version='1|
00000010 2e 30 27 20 65 6e 63 6f 64 69 6e 67 3d 27 63 70 |.0' encoding='cp|
00000020 31 32 35 31 27 3f 3e 0a 3c 72 6f 6f 74 3e 3c 61 |1251'?>.<root><a|
00000030 20 61 72 74 69 63 6c 65 3d 22 ff ff ff ff ff ff | article="......|
00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000060 ff ff ff ff |....|
00000064
[guest@localhost xmllong]$
[guest@localhost xmllong]$ wc file.xml
1 6 1500069 file.xml
[guest@localhost xmllong]$

Наверное, это баг в lxml, даже наверняка.



Отредактировано py.user.next (Март 31, 2017 12:45:24)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version