【问题标题】:Loop over common files in multiple folders循环遍历多个文件夹中的常用文件
【发布时间】:2021-02-26 17:51:00
【问题描述】:

如何在多个文件夹中找到具有相同文件名的文件,然后执行相同的操作?

def findCommonDeep(path1, path2):
    return set.intersection(*(set(os.path.relpath(os.path.join(root, file), path) for root, _, files in os.walk(path) for file in files) for path in (path1, path2)))
lista = []
for x in [2010, 2017, 2020]:
    if x > 2015:
        filepath = rf'My Documents\Analysis\{x}\LateAnalysis\*.csv'
    else:
        filepath = rf'My Documents\Analysis\{x}\Early_Analysis\*.csv'

    fname = os.path.basename(filepath, filepath)
    findCommonDeep(fname)

    for file in glob.glob(filename_common):
        df = pd.read_csv(file)
        df = df.set_index('date')
        lista.append(df)

【问题讨论】:

  • findCommonDeep 使用单个 arg 文件名调用,但使用 2 个关于路径的 args 定义。?
  • 是的,我很困惑。只需要找到所有文件夹之间的公共文件
  • 你能定义一下你所说的普通文件是什么意思吗?
  • 例如所有文件夹中的"file1.csv"
  • 递归地把它们全部全局化:glob.glob('**/file1.csv')

标签: python python-3.x pandas


【解决方案1】:

由于您已标记 pandas,让我们使用 pandaspathlib 返回具有相似名称的文件字典:

from pathlib import Path 
import pandas as pd 

def return_similair_files(start_dir : str) -> dict:

   all_files = Path(start_dir).rglob('*.csv')
   df = pd.DataFrame({'files' : all_files})
   df['name'] = df['files'].apply(lambda x : x.name) #pathlib method. 

   return df.groupby('name')['files'].agg(list).to_dict()

这将返回一个文件字典,如下所示:

{'file_1.csv' : [list_of_paths]}

然后您可以根据需要对它们进行操作。

【讨论】:

  • 谢谢!我是在循环中运行函数还是?具体在哪里?
  • @asd no 该函数替换了循环,然后您可以通过调用dfs = {name : pd.read_csv(f) for name, file in dictionary.items() for f in files} 或类似的方法非常简单地创建数据帧:)
  • 谢谢。如果函数有一个参数start_dir,那么其他文件夹的文件路径在哪里?抱歉,误解了。如果start_dir 代表:'My Documents\Analysis\,我猜那是行不通的,因为该文件夹还有其他不相关的 CSV
  • @asd 很抱歉错过了这条评论,你误会了rglob 它会搜索整个目录结构。您可以通过使用许多 pathlib 方法来过滤它来过滤您的路径。你必须用更具体的用例来更新你的问题,因为我不明白你的问题
  • 抱歉造成误会。我如何实际使用该功能。运行你的函数后,我是否运行return_similair_files('My Documents\Analysis\')?我会在哪里过滤路径?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2020-08-23
  • 1970-01-01
  • 2019-12-12
  • 2019-04-11
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多