【问题标题】:Progress bar while parsing files解析文件时的进度条
【发布时间】:2020-02-24 19:26:04
【问题描述】:

下面的代码转到一个包含 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 似乎是最容易实现的。

【问题讨论】:

  • 不是len(xml_files_list)吗?
  • @jingx,我希望我的要求不高,但你能帮我实现
  • 我不确定我是否理解问题所在。 xml_files_list 不正是您所需要的吗?
  • for xml_file in tqdm.tqdm(xml_files_list): ?

标签: python progress-bar


【解决方案1】:

你可以使用

for xml_file in tqdm.tqdm(xml_files_list):

它应该自动使用len(xml_files_list),它会返回xml_file

你不需要sleep()。例如,它在文档中仅用于减慢循环速度。

【讨论】:

  • 我应该将 for 循环与现有解析代码中的其他部分放在哪里?
  • tqdm.tqdm() 添加到现有的for xml_file in xml_files_list: 并保留在旧位置
  • 我不确定我应该将for xml_file in tqdm.tqdm(xml_files_list): 放在我的代码中的哪一行或哪里
  • 在您的代码中找到for xml_file in xml_files_list: 并在您的行中添加tqdm.tqdm() 以获得for xml_file in tqdm.tqdm(xml_files_list): 。你不必移动这条线。只添加tqdm.tqdm(),仅此而已。之前:for xml_file in xml_files_list: 之后:for xml_file in tqdm.tqdm(xml_files_list):
  • 这会影响代码的速度吗?
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-12-06
  • 2010-11-03
相关资源
最近更新 更多