Python Progress Bar во вложенном цикле - PullRequest
0 голосов
/ 01 декабря 2018

Я транслирую некоторые данные из журнала Linux в CSV для анализа данных.Некоторые инструкции занимают некоторое время, поэтому я решил добавить индикатор выполнения для каждого переводимого файла.Однако, когда я вставляю индикатор выполнения с помощью progresspar2 или tqdm, мои pandas dataframes и null.Там нет данных вообще.Когда я удаляю индикатор выполнения, все работает как надо.

Вот моя функция перевода CSV:

import pandas as pd
from dateutil import parser
from tqdm import trange
import os
import glob
import csv
import socket


def logsToCSV():
print("[+] Translating log to CSV")
log_file = open(CSV_FILE_PATH, "w", newline='')
csv_w = csv.writer(log_file)

for filename in glob.glob(os.path.join(LOGS_FILE_PATH, '*.txt')):       # Find all files in path with .txt
    data_file = open(filename, "r")
    file_length = len(data_file.readlines())

    for i in trange(file_length, desc='loop', leave=False):             # Progress Bar Via TQDM
        for new_line in data_file:

            new_line = line.strip().split(" ")
            date = str("%s %s %s" % (new_line[0], new_line[1], new_line[2])).strip()
            date = parser.parse(date)
            ip =str(new_line[5]).partition("/")
            ip = str(ip[0]).strip()
            try:
                url = str(new_line[7]).strip()
            except:
                url = None
            csv_w.writerow([date,ip,url])

enter image description here

TQDM что-то нарушает или я неправильно его реализую.

РЕДАКТИРОВАТЬ 1:

Я понял это.Я исчерпал файл, прочитанный во время моих readlines (), чтобы получить длину.Это работает:

def logsToCSV():
print("[+] Translating log to CSV")
log_file = open(CSV_FILE_PATH, "w", newline='')
csv_w = csv.writer(log_file)
path, dirs, files = next(os.walk(LOGS_FILE_PATH))
log_num = len(files)
print(log_num)

for filename in glob.glob(os.path.join(LOGS_FILE_PATH, '*.txt')):       # Find all files in path with .txt
    data_file = open(filename, "r")
    with open(filename, "r") as f:
        file_length = len(f.readlines())
    f.close()
    pbar = tqdm(total=file_length)
    for line in data_file:         
        new_line = line.strip().split(" ")
        date = str("%s %s %s" % (new_line[0], new_line[1], new_line[2])).strip()
        date = parser.parse(date)
        ip =str(new_line[5]).partition("/")
        ip = str(ip[0]).strip()
        try:
            url = str(new_line[7]).strip()
        except:
            url = None
        csv_w.writerow([date,ip,url])
        pbar.update(1)
    pbar.close()

1 Ответ

0 голосов
/ 01 декабря 2018

вы можете применить tqdm для вашего основного цикла:

из tqdm import tqdm для i в tqdam (условие):

...