【问题标题】:Undo files.split after matching Filename (python 3.x)匹配文件名后撤消 files.split (python 3.x)
【发布时间】:2015-11-03 11:06:58
【问题描述】:

文件名:

文件1:new_data_20100101.csv 文件2:samples_20100101.csv

时间戳总是 = %Y%m%d在文件名中 _ 之后和 .csv 之前

我想找到有 datasamplesfile 的文件,然后对这些文件做一些事情: 到目前为止我的代码:

for all_files in os.listdir():
    if all_files.__contains__("data_"):
        dataList.append(all_files.split('_')[2])
    if all_files.__contains__("samples_"):
        samplesList.append(all_files.split('_')[1])

这给了我缩减为Timestamp 和扩展名.csv 的文件名

现在我想尝试这样的事情

for day in dataList:
    if day in sampleList:
         open day as csv.....

我得到了两个文件都有时间戳的日期列表...我现在如何撤消该 files.split 以便我可以继续处理这些文件,因为现在我会收到一条错误消息告诉我,例如 _2010010.csv不存在,因为它是new_data_2010010.csv 我有点不确定如何使用os.basename,所以我会感谢一些关于数据名称的建议。 谢谢

【问题讨论】:

    标签: python split filenames


    【解决方案1】:

    您可以改为使用glob 模块来获取您的列表。这允许您仅过滤您的 CSV 文件。

    以下脚本创建两个字典,每个字典的键是文件名的日期部分,值是保存整个文件名。列表推导式创建一个包含每个匹配对的元组列表:

    import glob
    import os
    
    csv_files = glob.glob('*.csv')
    
    data_files = {file.split('_')[2] : file for file in csv_files if 'data_' in file}
    sample_files = {file.split('_')[1] : file for file in csv_files if 'samples_' in file}
    matching_pairs = [(sample_files[date], file) for date, file in data_files.items() if date in sample_files]
    
    for sample_file, data_file in sorted(matching_pairs):
        print('{} <-> {}'.format(sample_file, data_file))
    

    对于您的两个文件示例,这将显示以下内容:

    samples_20100101.csv <-> new_data_20100101.csv
    

    【讨论】:

    • 看起来很有趣我遇到了matching_pairs = [(sample_files[date], file) for date, file in data_files.iteritems() if date in sample_files] 的问题ìteritems 是否也需要在其他地方?
    • 我已经稍微修改了答案,因为它是为 Python 2.0 设计的。它现在应该可以在 Python 3.0 上运行。
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 2023-03-03
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多