使用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*
之后,用一些方法在每个子文件夹中获得最大的数目。我尝试了一些方法,但我想不出来。你能帮帮我吗?