【问题标题】:What is the fastest way to get list of filenames created in certain time period获取在特定时间段内创建的文件名列表的最快方法是什么
【发布时间】:2021-03-29 16:43:09
【问题描述】:

我有一个巨大的目录,里面有上千个文件

我想获取从晚上 7:30 到早上 7:30 创建的文件,反之亦然。

我一直在使用下面的代码,但它似乎随着文件的增加而变慢。我在 Linux 上运行它。

首先我在这里定义了get_time函数:

def get_time():

    tmp_date = datetime.now()
    year = tmp_date.year
    month = tmp_date.month
    day = tmp_date.day  
    date_start = datetime(year, month, day, 7,30)
    date_end = datetime(year, month, day, 19,30)
    shift = "Day Shift"

    if (date_start < tmp_date) and (tmp_date > date_end):
        date_start = datetime(year, month, day, 19,30)
        date_end = datetime(year, month, day, 7,30) + timedelta(1)
        shift = "Night Shift"
        
    elif (date_start > tmp_date) and (tmp_date < date_end):
        date_start = datetime(year, month, day, 19,30) - timedelta(1)
        date_end = datetime(year, month, day, 7,30)
        shift = "Night Shift"
    
    return date_start, date_end, shift

然后

def get_qc_success(ROOT_FOLDER):

    date_start, date_end, shift = get_time()
    
    files = []

    ARCHIVE_FOLDER = os.path.join(ROOT_FOLDER,"LOMS","ARCHIVE")
    files = os.listdir(ARCHIVE_FOLDER)
    for csv in os.listdir(ARCHIVE_FOLDER):
        path = os.path.join(ARCHIVE_FOLDER,csv)
        filetime = datetime.fromtimestamp(
                os.path.getctime(path))
        if (date_start < filetime < date_end):
            files.append(csv)
    len_success = len(files)
            
    return files, len_success, shift

还有其他方法可以让它更快吗?

【问题讨论】:

    标签: python time directory


    【解决方案1】:

    你可以用yielding 代替returning。

    def get_qc_success(ROOT_FOLDER,date_start,date_end):
    
        date_start, date_end, shift = get_time()
        
        files = []#You can remove this.
    
        ARCHIVE_FOLDER = os.path.join(ROOT_FOLDER,"LOMS","ARCHIVE")
        files = os.listdir(ARCHIVE_FOLDER)
        for csv in os.listdir(ARCHIVE_FOLDER):
            path = os.path.join(ARCHIVE_FOLDER,csv)
            filetime = datetime.fromtimestamp(
                    os.path.getctime(path))
            if (date_start < filetime < date_end):
                yield csv
    

    你还需要 len_success 对吧?文件的长度是多少?您也可以根据生成器变量计算它。

    对我来说这是最好的方法,为什么?检查here

    date_start, date_end, shift = get_time()
    generator = get_qc_success("filepathsample/",date_start,date_end) #Take note this generator contains your data being yielded in this case the csv variable from your function, you just need to iterate over it.
    len_files = sum(1 for x in generator)
    

    如果你的 get_time() 函数,我认为它会更好 如果你可以把它放在顶部 & 只需传入 date_start & date_end 变量。因为正如我在 GENERAL 中看到的,你只想得到 文件列表,您只是将它们附加到列表中 返回该列表。那么有一个更好的方法来做到这一点 使用 yield 关键字。

    您可以在此处查看yield 上的另一个问题。

    回报与收益

    来源here

    如果您仍然对yieldreturn 感到好奇,请使用此示例并进行测试运行并观察程序的输出和流程。如果您考虑yield,您将看到您将获得的好处。

    import time
    
    def foo():
        data = []
    
        for i in range(10):
            data.append(i)
            print("Sleeping")
            time.sleep(2)
    
    
        return data
    
    
    
    
    def foofoo():
        for i in range(10):
            yield i
            print("Sleeping")
            time.sleep(2)
    
    
    
    
    
    #Run this first and observe the Output program & flow
    for f in foo():
        print(f)
    
    
    
    '''
    #Run this second and observe the Output program & flow & comment out the first for loop for foo() above
    for f in foofoo():
        print(f)
    '''
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-06
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多