как проверить, указаны ли c файлы в папке или нет в автоматическом режиме в python - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть 1000 папок в каждом из их различных PDF-файлов. У меня есть go в каждой папке, и я проверяю, есть ли их конкретный c файл (например, папка называется school0001, а файлы именуются следующим: schoool_1m.pdf, schoool_2m.pdf .. schoool_10m.pdf). Теперь у меня есть go в первую папку и проверьте все доступные файлы PDF с месяца по месяц 10 или нет. Я должен проверить все 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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020
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

папок в моем тестовом пути

enter image description here

файлов в папках

enter image description here

0 голосов
/ 08 апреля 2020

Давайте попробуем создать mcve first

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"school{i: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"m{fn}.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)

EDIT , учитывая, что расширение списка до столбцов не работает, вы можете попробовать эти альтернативы

Альтернатива 1

df = df["fn"].apply(pd.Series)
df.columns = ['fldr','fn']

Альтернатива 2

df["fldr"] = df["fn"].str[0]
df["fn"] = df["fn"].str[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...