繁体   English   中英

如何决定首先应该循环哪个?

[英]how to decide which should be looped first?

我试图循环一个文件,并查找是否存在条目。 我需要搜索日期范围,并且不确定是先循环文件中的行,然后是每个日期,还是循环遍历日期然后查看每一行?

我尝试了两种选择,但下面的代码似乎更“合乎逻辑”。 我的问题是,如何像程序员一样推理出来? 为什么下面的代码不会尝试所有的single_date ,而是只遍历文件中的所有行。

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

对于速度而言,瓶颈几乎肯定会从文件读取,因此应该最小化。

您可以使用'for file in logFile:'作为外部循环来最小化行读取。

关于使用哪个循环,事实是通常有多种方法可以解决问题,几乎每个需要使用循环的编程问题都可以通过多种类型的循环来解决。 考虑到效率的关注,每种类型都有利弊。 本文将帮助您做出决定。 https://www.harrisgeospatial.com/Learn/Blogs/Blog-Details/ArtMID/10198/ArticleID/15332/What-Type-of-Loop-Should-I-Use

文件:

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.")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM