使用Python搜索(在文件夹和子文件夹中)并将文件读取到数据帧列表中

使用Python搜索(在文件夹和子文件夹中)并将文件读取到数据帧列表中,python,pandas,dataframe,Python,Pandas,Dataframe,我有密码 df1 = pd.read_excel('DIRECTORY\\file.xlsm', sheetname='Resume', header=1, usecols='A:I') #some operations Final_file=pd.concat([df1,bf1],ignore_index=True) 请注意,df和bf正在读取同一个文件,不同之处在于所读取的列 我有很多档案 是否可以遍历文件夹和子文件夹,搜索文件名模式并创建要读取的数据帧列表,而不是写入我拥有的每个路径?以

我有密码

df1 = pd.read_excel('DIRECTORY\\file.xlsm', sheetname='Resume', header=1, usecols='A:I')
#some operations
Final_file=pd.concat([df1,bf1],ignore_index=True)

请注意,df和bf正在读取同一个文件,不同之处在于所读取的列

我有很多档案


是否可以遍历文件夹和子文件夹,搜索文件名模式并创建要读取的数据帧列表,而不是写入我拥有的每个路径?

以下是一段代码片段,可能有助于您的原因:-

source = r'C:\Mypath\SubFolder'
for root, dirs, files in os.walk(source):
    for name in files:
        if name.endswith((".xls", ".xlsx",".xlsm")):
            filetoprocess=os.path.join(root,name)
            df=pd.read_excel(filetoprocess, sheetname='Resume', header=1, usecols='A:I')

希望能有所帮助。

以下是一段代码片段,可能对您的事业有所帮助:-

source = r'C:\Mypath\SubFolder'
for root, dirs, files in os.walk(source):
    for name in files:
        if name.endswith((".xls", ".xlsx",".xlsm")):
            filetoprocess=os.path.join(root,name)
            df=pd.read_excel(filetoprocess, sheetname='Resume', header=1, usecols='A:I')

希望对您有所帮助。

您可以使用glob library来完成此操作-

from glob import glob

filenames = glob('./Folder/pattern*.xlsx')  #pattern is the common pattern in filenames
dataframes = [pd.read_excel(f) for f in filenames] #sequentially read all the files and create a dataframe for each file
master_df = pd.concat(dataframes) #master dataframe after concatenating all the dataframes



您可以使用glob library执行此操作-

from glob import glob

filenames = glob('./Folder/pattern*.xlsx')  #pattern is the common pattern in filenames
dataframes = [pd.read_excel(f) for f in filenames] #sequentially read all the files and create a dataframe for each file
master_df = pd.concat(dataframes) #master dataframe after concatenating all the dataframes



您可以对
pathlib
glob

注意
parent\u path
应该是您要搜索的顶级文件夹

from pathlib import Path

files = [file for file in Path(parent_path).rglob('*filename*.xls')]
这将返回符合您的条件的文件列表。然后,您可以创建一个列表comp

dfs = [ pd.read_excel(file, sheet_name='Resume', header=1, usecols='A:I') for file in files]

df1 = pd.concat(dfs)
按修改时间编辑最新文件。 我们可以使用下面的函数获取路径并返回pathlib对象列表以获取最新修改时间,我们通过在分隔符上拆分来获取唯一的文件,这样sales_v1、sales_v2、sales_v3都将成为sales。然后,我们从三个文件中获得最新修改的文件

import pandas as pd
from pathlib import Path
def get_latest_files(path):

    files = {
        f: pd.Timestamp(f.stat().st_mtime, unit="s") for f in Path(path).rglob("*.csv")
    }

    df = (
        pd.DataFrame.from_dict(files, orient="index")
        .reset_index()
        .rename(columns={"index": "path", 0: "seconds"})
    )

    df["dupe_files"] = df["path"].apply(lambda x: x.stem).str.split("_", expand=True)[0]

    max_files = (
        df.groupby(["dupe_files", "path"])
        .max()
        .groupby(level=0)["seconds"]
        .nlargest(1)
        .to_frame()
        .reset_index(-1)["path"]
        .tolist()
    )
    return max_files

您可以对
pathlib
glob

注意
parent\u path
应该是您要搜索的顶级文件夹

from pathlib import Path

files = [file for file in Path(parent_path).rglob('*filename*.xls')]
这将返回符合您的条件的文件列表。然后,您可以创建一个列表comp

dfs = [ pd.read_excel(file, sheet_name='Resume', header=1, usecols='A:I') for file in files]

df1 = pd.concat(dfs)
按修改时间编辑最新文件。 我们可以使用下面的函数获取路径并返回pathlib对象列表以获取最新修改时间,我们通过在分隔符上拆分来获取唯一的文件,这样sales_v1、sales_v2、sales_v3都将成为sales。然后,我们从三个文件中获得最新修改的文件

import pandas as pd
from pathlib import Path
def get_latest_files(path):

    files = {
        f: pd.Timestamp(f.stat().st_mtime, unit="s") for f in Path(path).rglob("*.csv")
    }

    df = (
        pd.DataFrame.from_dict(files, orient="index")
        .reset_index()
        .rename(columns={"index": "path", 0: "seconds"})
    )

    df["dupe_files"] = df["path"].apply(lambda x: x.stem).str.split("_", expand=True)[0]

    max_files = (
        df.groupby(["dupe_files", "path"])
        .max()
        .groupby(level=0)["seconds"]
        .nlargest(1)
        .to_frame()
        .reset_index(-1)["path"]
        .tolist()
    )
    return max_files

这回答了你的问题吗?不,不完全是因为我在一个主文件夹中,我想浏览子文件夹,但我不想在主文件夹之外搜索。然而,你的建议是一本很好的读物,有助于理解一些图书馆是如何工作的。谢谢这回答了你的问题吗?不,不完全是因为我在一个主文件夹中,我想浏览子文件夹,但我不想在主文件夹之外搜索。然而,你的建议是一本很好的读物,有助于理解一些图书馆是如何工作的。谢谢,效果很好。非常感谢。我只需将
sheet name
编辑为
sheet\u name
。我不知道我是否可以在这里提出另一个问题,但这是相关的:如果我在一个文件夹中有多个文件,名称相同,但版本不同,例如“filename v2”,是否可以选择最新版本?(我也不需要手动编写该版本,因为文件夹几乎每天都在更新)好的,我会尝试实施你的建议,但会等待你的回答。(同时,如果我能实现这个输出,我会告诉你)因此我将尝试拆分名称
文件名v#
,并选择最大值
它必须使用
文件名v#
来实现,而不是在
修改日期之前,因为我无法确保以前的版本没有被编辑。我无法解决它,因为我只能找到有关文件
修改日期的帖子。我想的是使用你的代码:
文件
.rglob('*filename*v*.xls')]
然后在
v*
之后,用一些方法在每个子文件夹中获得最大的数目。我尝试了一些方法,但我想不出来。你能帮帮我吗?效果很好。非常感谢。我只需将
sheet name
编辑为
sheet\u name
。我不知道我是否可以在这里提出另一个问题,但这是相关的:如果我在一个文件夹中有多个文件,名称相同,但版本不同,例如“filename v2”,是否可以选择最新版本?(我也不需要手动编写该版本,因为文件夹几乎每天都在更新)好的,我会尝试实施你的建议,但会等待你的回答。(同时,如果我能实现这个输出,我会告诉你)因此我将尝试拆分名称
文件名v#
,并选择最大值
它必须使用
文件名v#
来实现,而不是在
修改日期之前,因为我无法确保以前的版本没有被编辑。我无法解决它,因为我只能找到有关文件
修改日期的帖子。我想的是使用你的代码:
文件
.rglob('*filename*v*.xls')]
然后在
v*
之后,用一些方法在每个子文件夹中获得最大的数目。我尝试了一些方法,但我想不出来。你能帮帮我吗?