【问题标题】:Loop over files in different folders循环遍历不同文件夹中的文件
【发布时间】:2021-04-25 11:00:40
【问题描述】:

如何循环访问 2 个文件夹?在 Apple 及其所有子文件夹中,我想查找包含“绿色”的 Excel 文件。在 Banana 中,我想查找包含“黄色”的文件。我明确需要指定文件夹路径,不能只循环整个 C 盘。

import os
folders = ['C:/Desktop/apple', 'C:/Downloads/banana']
for x in in range(len(folders)):
    for root, dirs, files in os.walk(folders[i]):
        for file in files:
            if file.endswith(".xlsx") and "banana" in folders[i] and "yellow" in file:
                df = pd.read_excel(os.path.join(root, file))
                df['date'] = pd.to_datetime(df.date)
                ...

            if file.endswith(".xlsx") and "apple" in folders[i] and "green" in file:
                df = pd.read_excel(os.path.join(root, file))
                df['date'] = pd.to_datetime(df.date)
                ...

由于所有的 excel 文件看起来都一样,我上面的代码很麻烦,因为我正在复制代码来读取数据帧并清理 df。

【问题讨论】:

    标签: python python-3.x pandas glob pathlib


    【解决方案1】:

    获取所有符合您条件的文件路径的最简单方法是使用glob 包:

    import glob
    for file in glob.glob('C:/Desktop/apple/*green*.xlsx') + glob.glob('C:/Desktop/banana/*yellow*.xlsx'):
        print(file)
        df = pd.read_excel(os.path.join(root, file))
        df['date'] = pd.to_datetime(df.date)
    

    Glob 使用正则表达式模式匹配。如果你想选择只以green开头的文件,你可以像sogreen*这样去掉第一个星号。

    为此使用pathlib

    from pathlib import Path
    for file in [f"C:/Desktop/{f}" for f in list(Path('apple').glob('*green*.csv')) + list(Path('banana').glob('*yellow*.csv'))]:
        df = pd.read_excel(os.path.join(root, file))
        df['date'] = pd.to_datetime(df.date)
    

    【讨论】:

    • 非常感谢,如果可能,很抱歉:如果我想在 Apple 文件夹中搜索“绿色”或“红色”,是否可以在此行添加“或”语句glob.glob('C:/Desktop/apple/*green*.xlsx') .还是我必须添加另一个 + 语句?
    【解决方案2】:

    您可以创建一个字典,其中键是文件夹,值是要搜索的内容。伪代码:

    import os
    
    to_search = {                             # <--- the dictionary
        "C:/Desktop/apple": "green",
        "C:/Desktop/banana": "yellow",
    }
    
    for folder, item in to_search.items():    # <--- use dict.items()
        for root, dirs, files in os.walk(folder):  # <--- here you use "folder"
            for file in files:
                if file.endswith(".xlsx") and item in file:   # <--- here you use "item"
                    df = pd.read_excel(os.path.join(root, file))
                    df["date"] = pd.to_datetime(df.date)
    
                    # ...
    

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多