首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出名称与日期匹配模式的文件

列出名称与日期匹配模式的文件
EN

Code Review用户
提问于 2018-07-30 21:09:17
回答 2查看 2.4K关注 0票数 2

我的目录folderMarket有许多同名的文件,但在末尾用日期字符串进行标记。日期标签的格式可以不同,例如"2018-07-25“或”25-7月18“。我的助手函数的任务是提取一个路径列表,将每个找到的文件名与filename_list匹配。是否有更好的方法来构建filename_list而不是下面使用的蛮力?

代码语言:javascript
复制
from datetime import datetime


strToday = "2018-07-25"
files_market = ['apples_DATE.xml', 'peaches_DATE.xml', 'cucumbers_DATE.xml', 'potatos_DATE.xml', 'tomates.DATE.csv']


def get_path_list(directory, base_filename_list, savedAsOf):

    strDate1 = savedAsOf
    filename_list1 = [n.replace('DATE', strDate1) for n in base_filename_list]

    strDate2 = datetime.strptime(savedAsOf, '%Y-%m-%d').strftime('%d%b%y')
    filename_list2 = [n.replace('DATE', strDate2) for n in base_filename_list]
    filename_list = filename_list1 + filename_list2

    path_list = []
    for file in os.listdir(directory):
        filename = os.fsdecode(file)
        if filename in filename_list:
            path_list.append(os.path.join(directory, filename))
            continue
    return path_list

print (len(get_path_list(folderMarket, files_market, strToday)))
EN

回答 2

Code Review用户

发布于 2018-07-31 07:56:00

  • 您的代码使用了snake_case和camelCase的混合,您应该坚持特定的样式。如果要编写python,应该使用PEP8状态snake_case作为预期的样式。
  • 您的代码缺少if __name__ == "__main__":启动部分。我建议你买这个。例如,如果您没有这样的工具,当您使用Sphinx这样的工具生成代码文档时,它实际上将运行您的代码,而不仅仅是构建对象。而且,这也是一种预期:-)

至于您拥有的核心问题,您可以使用pathlib的S Path对象来帮助文件的全局化和文件参数的匹配,以及字符串格式化format函数将“占位符”替换为某个值。例如:

代码语言:javascript
复制
from pathlib import Path


def get_path_list(directory, base_filename_list, saved_as_of):
    for template in base_filename_list:
        file_date = template.format(saved_as_of)
        print(f"looking for {file_date}")
        files = Path(directory).glob(file_date)
        for file in files:
            print(str(file))


if __name__ == "__main__":
    today = "2018-07-25"
    files_market = ['apples_{}.xml', 'peaches_{}.xml', 'cucumbers_{}.xml', 'potatoes_{}.xml', 'tomatoes.{}.csv']
    get_path_list(".", files_market, today)

上面的代码将为您提供90%的方法,但我将把它作为一个练习留给您完成。

祝好运!

票数 1
EN

Code Review用户

发布于 2018-08-01 19:25:29

谢谢你的指点,这是我能掌握的全部。不知道如何按照您的意愿使用格式函数。如果我正确地解释了你的答案,我认为pathlib glob只接受str,而不是list

代码语言:javascript
复制
from pathlib import Path
from datetime import datetime


def get_path_list(directory, base_filename_list, saved_as_of):
    # list of possible save_as_of date formats
    date = datetime.strptime(saved_as_of, '%Y-%m-%d')
    formatted_dates_list = [saved_as_of, 
                            date.strftime('%d%b%y'),]
    #extended list with each possible date format combo
    extended_base_filename_list  = [f.replace("DATE", d) for f in base_filename_list
                                    for d in formatted_dates_list]
    globbed_list = [str(file.name) for f in formatted_dates_list
         for file in Path(directory).glob('*' + f + '.*')]
    #intersection of two lists
    return list(set(extended_base_filename_list) & set(globbed_list))


if __name__ == "__main__":
    today = "2018-07-25"
    folder = "."
    files_market = ['apples_DATE.xml', 'peaches_DATE.xml', 'cucumbers_DATE.xml', 'potatoes_DATE.xml', 'tomatoes.DATE.csv']
    test = get_path_list(folder, files_market, today)
    print(*test)

这就产生了:

代码语言:javascript
复制
apples_2018-07-25.xml tomatos.25Jul18.csv cucumbers_2018-07-25.xml peaches_2018-07-25.xml potatos_2018-07-25.xml
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/200620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档