Python - запрос файла GZ и разбор XML - PullRequest
0 голосов
/ 06 марта 2020

Я начал изучать Python несколько дней go, чтобы построить базовый c сайт для сбора статистики из проектов BOIN C, например, SETI@home et c.

В основном сайт делает:

  • Загрузка файлов gz
  • Распаковка файлов gz в xml файлы
  • Встраивание xml информации в структуры данных
  • Запись структур данных обратно в файлы cvs

Всего 34 файла .gz из 34 различных проектов BOIN C.

Весь код теперь завершен и работает, однако файл .gz из одного проекта отказывается анализировать, тогда как остальные 34 работают нормально.

Файл:

user.gz

из

http://www.rnaworld.de/rnaworld/stats/

Вот ошибки, которые я получаю:

Traceback (most recent call last):
  File "C:/Users/chris/PycharmProjects/testproject1/rnaw100.py", line 77, in <module>
    for event, elem in ET.iterparse(str(x_file_name2), events=("start", "end")):
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1227, in iterator
    yield from pullparser.read_events()
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1302, in read_events
    raise event
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38-32\lib\xml\etree\ElementTree.py", line 1274, in feed
    self._parser.feed(data)
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

Это код, который загружает файл .gz и разбирает XML: (я пропустил объявления var et c)

Как новичок ie Мне трудно понять, что не так, поскольку (а) ошибки относятся к Python файлу ядра например, ElementTree.py и (б) я не могу понять, почему не работает файл .gz, который используют многие другие сайты статистики BOIN C, и (c), почему мой код работает с 34 файлами, но не это 1.

response = requests.get(url2, stream=True)

if response.status_code == 200:
    with open(target_path2, 'wb') as f:
        f.write(response.raw.read())

with gzip.open(target_path2, 'rb') as f_in:
    with open(x_file_name2, 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

for event, elem in ET.iterparse(str(x_file_name2), events=("start", "end")):

    if elem.tag == "total_credit" and event == "end":
        tc=float(elem.text)
        elem.clear

    if elem.tag == "expavg_credit" and event == "end":
        ac=float(elem.text)
        elem.clear

    if elem.tag == "id" and event == "end":
        id=elem.text
        elem.clear

    if elem.tag == "cpid" and event == "end":
        cpid=elem.text
        elem.clear

    if elem.tag == "name" and event == "end":
        name = elem.text
        elem.clear()
    teamid=TEAMID

    if elem.tag == "teamid" and event == "end":
        if elem.text == TEAMID:
            cnt=cnt+1
            dic[id]={"Name":name,"CPID":cpid, "TC":tc, "AC":ac}
        elem.clear()

1 Ответ

0 голосов
/ 11 марта 2020

Другое решение.

from simplified_scrapy import SimplifiedDoc,req,utils
import gzip
with gzip.open('user.gz', 'rb') as f_in:
  with open('user.xml', 'wb') as f_out:
    f_out.write(f_in.read())
html = utils.getFileContent('user.xml')
doc = SimplifiedDoc(html)
users = doc.selects('user')
for user in users:
  tags = user.children

@ Крис Я распаковываю файл и сохраняю его. Данные верны. Попробуйте заменить свой шутил на него.

import gzip
with gzip.open('user.gz', 'rb') as f_in:
    with open('user.xml', 'wb') as f_out:
        f_out.write(f_in.read())
...