如何在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 range m = [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(最近一次调用最后一次) in 16 17 # 将列表扩展到列 ---> 18 df = pd.DataFrame(df['fn'].values.tolist(), columns=['fldr','fn']) AssertionError: 2通过的列,传递的数据有 0 列 在这一行 # 将列表扩展到列 df = pd.DataFrame(df['fn'].values.tolist(), columns=['fldr','fn']) 你使用的是哪个熊猫版本? 文件名应与文件夹名相同 例如 school0001 是文件夹名和文件名 school0001_m1.pdf, school0001_m2.pdf, ..school0001_m10.pdf, python 3 是我正在使用的版本@rpanai

以上是关于如何在python中以自动方式检查文件夹中是不是存在特定文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios swift 中以编程方式创建自动布局等宽约束?

如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?

如何在ios swift中以编程方式创建自动布局等宽度约束?

如何在 Python 中以编程方式传递密码

在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码

如何在Java中以不区分大小写的方式检查一个字符串是不是包含另一个字符串?