как решить, что должно быть зациклено первым? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь перебрать файл и найти, существует ли запись. Мне нужно выполнить поиск по диапазону дат, и я не уверен, следует ли сначала циклически повторять строки в файле, а затем каждую дату или циклически повторять даты, а затем просматривать каждую строку?

Я испробовал оба варианта, но приведенный ниже код кажется более «логичным». Мой вопрос, как одна из причин, как программист? И почему приведенный ниже код не пытается выполнить все single_date s, а выполняет итерацию только один раз по всем строкам в файле.

with open(r'reportLog.txt','r') as logFile:
    for single_date in daterange(start_date, end_date):
        for line in logFile:
            if all(var in line for var in (reportName, str(single_date), 'R')):
                print('found')
                break
            else:
                print('not found')

reportLog.txt:

Digital_Incomplete_Leads,2019-05-10,12:15:29,12:15:29,Y
Digital_Incomplete_Leads,2019-05-09,12:15:43,12:15:43,Y
Account Movement Report,2019-05-06,13:54:07,13:54:12,Y
Account Movement Report,2019-05-07,13:54:07,13:54:12,Y
Account Movement Report,2019-05-08,13:54:07,13:54:12,Y
Account Movement Report,2019-05-09,13:53:38,13:53:38,R
Account Movement Report,2019-05-09,13:54:07,13:54:12,Y

Я хочу, чтобы код перебрал текстовый файл и завершил работу, когда обнаружил следующую строку:

Account Movement Report,2019-05-09,13:53:38,13:53:38,R

Ответы [ 3 ]

0 голосов
/ 09 мая 2019

Относительно того, какой цикл использовать, Правда в том, что обычно существует несколько способов решения проблемы, и почти каждая проблема программирования, для которой требуется использование цикла, может быть решена с использованием более чем одного типа цикла.Учитывая озабоченность эффективностью, у каждого типа есть свои плюсы и минусы.Эта статья поможет вам определиться.https://www.harrisgeospatial.com/Learn/Blogs/Blog-Details/ArtMID/10198/ArticleID/15332/What-Type-of-Loop-Should-I-Use

0 голосов
/ 09 мая 2019

Файл:

Digital_Incomplete_Leads,2019-05-10,12:15:29,12:15:29,Y
Digital_Incomplete_Leads,2019-05-09,12:15:43,12:15:43,Y
Account Movement Report,2019-05-06,13:54:07,13:54:12,Y
Account Movement Report,2019-05-07,13:54:07,13:54:12,Y
Account Movement Report,2019-05-08,13:54:07,13:54:12,Y
Account Movement Report,2019-05-09,13:53:38,13:53:38,R
Account Movement Report,2019-05-09,13:54:07,13:54:12,Y

Код:

import csv
from datetime import datetime    

start_date = datetime.strptime("2019-05-06", "%Y-%m-%d")
end_date = datetime.strptime("2019-05-08", "%Y-%m-%d")
with open('main_data.csv') as f:
    csv_reader = csv.reader(f)
    for idx, line in enumerate(csv_reader):
        try:
            d = datetime.strptime(line[1], "%Y-%m-%d")
            if start_date <= d <= end_date:
                print(f"Found \"{line[1]}\" in {idx} row.")
                break
        except ValueError:
            print(f"Second column in {idx} row contain no date.")
        except IndexError:
            print(f"There's no second column in {idx} row.")
        except:
            print(f"Something unexpected in {idx} row.")
    else:
        print("Nothing have been found.")

Выход:

Found "2019-05-06" in 2 row.

Если вы хотите использовать daterange(), какой-то неизвестный (для меня) метод:

import csv


def daterange(start, end):
    # unknown method #
    pass


d_range = daterange("2019-05-06", "2019-05-08")
with open('main_data.csv') as f:
    csv_reader = csv.reader(f)
    for idx, line in enumerate(csv_reader):
        try:
            if line[1] in d_range:
                print(f"Found \"{line[1]}\" in {idx} row.")
                break
        except ValueError:
            print(f"Second column in {idx} row contain no date.")
        except IndexError:
            print(f"There's no second column in {idx} row.")
        except:
            print(f"Something unexpected in {idx} row.")
    else:
        print("Nothing have been found.")
0 голосов
/ 09 мая 2019

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

Вы можете минимизировать чтение строк, используя 'for line in logFile:' в качестве внешнего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...