如何在python中以自动方式检查文件夹中是不是存在特定文件
Posted
技术标签:
【中文标题】如何在python中以自动方式检查文件夹中是不是存在特定文件【英文标题】:how to check the specific files is present in folder or not in automated way in python如何在python中以自动方式检查文件夹中是否存在特定文件 【发布时间】:2020-07-21 04:15:16 【问题描述】:我在每个可用的不同 pdf 文件中都有 1000 个文件夹。我已经进入每个文件夹并检查它们的特定文件(例如文件夹被命名为school0001并且文件被命名为schoool_1m.pdf,schoool_2m.pdf ..schoool_10m.pdf)现在我已经进入第一个文件夹并检查所有第 1 个月到第 10 个月的 pdf 是否可用,我必须在检查后检查所有 1000 文件夹(该文件夹名为 school0001 ......school1000。)。我创建了一个数据框,如下所示。
我想要的结果如下
如果 _m1.pdf 存在于文件夹中,则它在数据框中具有是或否,就像每个文件夹中的所有 10 个文件(总共 1000 个文件夹)一样
s1 m1 m2 ... m10
school0001 yes yes yes
school0002 no yes yes
school0003 yes no yes
..
..
..
school1000 yes yes yes
【问题讨论】:
欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。花一些时间与the Tutorial 一起练习示例。它将让您了解 Python 提供的帮助您解决问题的工具。 【参考方案1】:import glob
import os
import pandas as pd
# the path to your folder
folder_path = r'some\path\to\your\folder'
# list the directories in the folder path
folders = os.listdir(folder_path)
# create an empty list to append to
dfs = []
# iterate through all the folders in your path
for folder in folders:
# f-string to create the path to each individual folder
path = f'folder_path\\folder'
# list comprehension to get the file names: school_m1, school_m2
files = [os.path.basename(os.path.normpath(filename)).split('.')[0] for filename in glob.glob(f'path\\*.pdf')]
# create a list of all your _m values
m = [f.split('_')[1] for f in files]
# create a dataframe where the index is the folder name and the columns are the _m values
df = pd.DataFrame(index=[folder], columns=m).fillna('Yes')
# append dataframe to the empty list
dfs.append(df)
# create a final dataframe by concatenating all the dataframes in the list
final_df = pd.concat(dfs).fillna('No')
m1 m10 m4 m6 m2 m8
school001 Yes Yes Yes Yes No No
school002 Yes No No Yes Yes Yes
我的测试路径中的文件夹
文件夹中的文件
【讨论】:
7 # 创建所有 m 值的列表 ----> 8 m = [f.split('')[1] for f in files] 9 # 创建一个数据框,其中索引是文件夹名称,列是 _m 值 10 df = pd.DataFrame(index=[folder], columns=m).fillna('Yes') IndexError: list index out of rangem = [f.split('')[1] for f in files]
你没有在任何事情上拆分f
,所以1
的索引是我们的范围。在我的示例中,我拆分'_'
,因为您的问题表明文件名是school_m1
,代码会将字符串拆分为['school', 'm1']
,因此您调用第二个元素,因为我们只想要m1
。当你拆分一个空字符串时,你会得到['school_m1']
,它是列表中的零元素【参考方案2】:
让我们先尝试创建一个mcve
import os
import random
import pandas as pd
# this create an empty file
def touch(path):
with open(path, 'a'):
os.utime(path, None)
fldr = "main_folder"
for i in range(10):
new_fldr = os.path.join(fldr, f"schooli:03d")
os.makedirs(new_fldr, exist_ok=True)
for k in range(5):
fn = random.randint(1,10)
fn = os.path.join(new_fldr, f"mfn.pdf")
touch(fn)
现在我们有 10 个文件夹,每个文件夹(最多)5 个文件,每个文件的名称都是随机的。然后我们要读取嵌套在main folder
中的所有文件
def recursive_get_files(path):
out = []
for (dirpath, dirnames, filenames) in os.walk(path):
if len(filenames) > 0:
out += [os.path.join(dirpath, fn)
for fn in filenames]
return out
out = recursive_get_files(fldr)
# we put these filenames on a df
df = pd.DataFrame("fn":out)
# split rname and remove the first one
df["fn"] = df["fn"].str.split("/").str[1:]
# expand list to columns
df = pd.DataFrame(df['fn'].values.tolist(), columns=['fldr','fn'])
# These are existing files
df["exist"] = True
# Use pivot_table
pv = pd.pivot_table(df,
index="fldr",
columns="fn",
values="exist")\
.fillna(False)
编辑鉴于列的展开列表不起作用,您可以尝试这些替代方法
备选方案 1
df = df["fn"].apply(pd.Series)
df.columns = ['fldr','fn']
备选方案 2
df["fldr"] = df["fn"].str[0]
df["fn"] = df["fn"].str[1]
【讨论】:
------------------------------------------ --------------------------------- AssertionError Traceback(最近一次调用最后一次)以上是关于如何在python中以自动方式检查文件夹中是不是存在特定文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios swift 中以编程方式创建自动布局等宽约束?
如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?
如何在ios swift中以编程方式创建自动布局等宽度约束?