Индикатор выполнения при разборе файлов - PullRequest
0 голосов
/ 24 февраля 2020

Приведенный ниже код идет в каталог, в котором есть xml файлы, он берет их и анализирует их в фрейме данных.

from xml.etree import ElementTree as ET
from collections import defaultdict
from pathlib import Path
import csv
from pathlib import Path


directory = 'C:/Users/xml_files'

with open('try.csv', 'w', newline='') as f:
    writer = csv.writer(f, delimiter=';')
   #◙ writer = csv.writer(f)

    headers = ['identify','id', 'service_code', 'rational', 'qualify', 'description_num', 'description_txt','Counter', 'set_data_xin', 'set_data_xax', 'set_data_value', 'set_data_x']

    writer.writerow(headers)

    xml_files_list = list(map(str,Path(directory).glob('**/*.xml')))
    for xml_file in xml_files_list:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        p_get = tree.find('.//Phones/Get').text
        p_set = tree.find('.//Phones/Set').text


        start_nodes = root.findall('.//START')
        for sn in start_nodes:
            row = defaultdict(str)

            # <<<<< Indentation was wrong here
            for k,v in sn.attrib.items():
                row[k] = v
            for rn in sn.findall('.//Rational'):
                row['Rational'] = rn.text

            for qu in sn.findall('.//Qualify'):
                row['Qualify'] = qu.text

            for ds in sn.findall('.//Description'):
                row['Description_txt'] = ds.text
                row['Description_text_id'] = ds.attrib['text_id']



            for counter, st in enumerate( sn.findall('.//SetData') ):
                for k,v in st.attrib.items():
                    if v.startswith("-"):
                        v = v.replace("-","",1)
                    v=v.replace(',', '.')
                    row['SetData_'+ str(k)] = v
                row["Counter"] = counter 
                row_data = [row[i] for i in headers]
                row_data[0]=p_get + '_' + p_set
                writer.writerow(row_data)
                row = defaultdict(str)

При использовании большего количества данных действительно трудно просто ждать и не знаю, как далеко был выполнен анализ данных.

Поэтому я пошел и попытался найти способ показать индикатор выполнения. Я закончил тем, что нашел следующее

import tqdm
import time

for i in tqdm.tqdm(range(1000)):
    time.sleep(0.01)
    # or other long operations

У меня возникли проблемы с внедрением кода в мой код и нахождением диапазона, который предпочтительно должен был бы быть для получения номеров файлов Xml в этом каталоге

Эта библиотека tqdm казалась самой простой в реализации.

1 Ответ

1 голос
/ 24 февраля 2020

Вы можете использовать

for xml_file in tqdm.tqdm(xml_files_list):

, оно должно автоматически использовать len(xml_files_list) и вернет xml_file.

И вам не нужно sleep(). Он использовался в документации только для замедления, например, l oop.

...