Итерируйте по огромному XML-файлу и получите значение? - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу перебрать файл дампа Stackoverflow пользователей.Проблема в том, что он очень большой и это XML.Для меня XML это новая тема.Я прочитал несколько документов и Stackoverflow Post, но по какой-то причине он не работает.

Формат XML:

<users>
  <row Id="-1" Reputation="1" 
  CreationDate="2008-07-31T00:00:00.000" 
  DisplayName="Community" 
  LastAccessDate="2008-08-26T00:16:53.810" 
  WebsiteUrl="http://meta.stackexchange.com/" 
  Location="on the server farm" AboutMe="&lt;p&gt;Hi, I'm not really a person.&" Views="649" UpVotes="245983" DownVotes="924377" AccountId="-1" 
  />
</users>

Код:

from xml.etree.ElementTree import iterparse

for evt, elem in iterparse('data/Users.xml', events=('start','end')):
    print(evt, elem)

Что я получаю:

Цикл For Loop запечатлел мне кучу гексакодов.И в конце я получаю исключение памяти.Может быть, это нормально, потому что я пробую второй раз, и он очень быстро перебирает xml 0.13 seconds

start <Element 'row' at 0x04CC16F0>
end <Element 'row' at 0x04CC16F0>
start <Element 'row' at 0x04CC1810>

Надеюсь, вы, ребята, можете помочь с помощью Вопроса.Как я могу получить значение этого вывода?Я хочу сохранить его в SQL.

Весь файл занимает 199 ГБ (значок, комментарий, ссылки, постистория, пользователи, сообщения, теги и голоса).Файл Users.xml, специфичный для этого вопроса, составляет 2,49 ГБ.Но я хочу поместить все данные из SO в базу данных.

С уважением

HanahDevelope

1 Ответ

0 голосов
/ 25 апреля 2018

Похоже, вам просто нужно перебрать событие end для всех элементов row и сделать что-то с атрибутами:

from xml.etree.ElementTree import iterparse

for evt, elem in iterparse('data/Users.xml', events=('end',)):
    if elem.tag == 'row':
        user_fields = elem.attrib
        print(user_fields)

Будет выведено:

{'DisplayName': 'Community', 'Views': '649', 'DownVotes': '924377', 'LastAccessDate': '2008-08-26T00:16:53.810', 'Id': '-1', 'WebsiteUrl': 'http://meta.stackexchange.com/', 'Reputation': '1', 'Location': 'on the server farm', 'UpVotes': '245983', 'CreationDate': '2008-07-31T00:00:00.000', 'AboutMe': "<p>Hi, I'm not really a person.", 'AccountId': '-1'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...