Как l oop через файловую папку запустить скрипт для каждого элемента в папке? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть скрипт, который берет образец из файла Excel и выплевывает этот образец в виде csv. Как можно go зациклить файловую папку с несколькими файлами Excel, чтобы избежать изменения файла при каждом запуске скрипта? Я полагаю, что могу использовать glob, но это просто объединяет все файлы Excel.

import pandas as pd
import glob

root_dir = r"C:\Users\bryanmccormack\Desktop\Test_Folder\*.xlsx"
excel_files = glob.glob(root_dir, recursive=True)

for xls in excel_files:
    df_excel = pd.read_excel(xls)
    df_excel = df_excel.loc[(df_excel['Track Item']=='Y')]

def sample_per(df_excel):
    if len(df_excel) <= 10000:
        return df_excel.sample(frac=0.05)
    elif len(df_excel) >= 15000:
        return df_excel.sample(frac=0.03)
    else:
        return df_excel.sample(frac=0.01)

final = sample_per(xls)

df_excel.loc[df_excel['Retailer Item ID'].isin(final['Retailer Item ID']), 'Track Item'] = 'Audit'

df_excel.to_csv('Testicle.csv',index=False)

Ответы [ 2 ]

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

Вы были на правильном пути, но использование pd.concat () было 'ответственным за слияние ваших файлов Excel. Этот фрагмент должен помочь вам:

import pandas as pd
import glob

# use regex style to get all files with xlsx extension
root_dir = r"excel/*.xlsx"
# this call of glob only gives xlsx files in the root_dir
excel_files = glob.glob(root_dir)

# iterate over the files
for xls in excel_files:
    # read
    df_excel = pd.read_excel(xls)
    # manipulate as you wish here
    df_new = df_excel.sample(frac=0.1)
    # store
    df_new.to_csv(xls.replace("xlsx", "csv"))

Обратите внимание, что вы также можете передать recursive = True в вызове glob, который дает вам (из python 3+, я считаю) все файлы Excel из подкаталоги.

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

Возвращает список всех файлов в каталоге, в котором вы можете выполнить итерацию:

from os import walk
from os.path import join

def retrieve_file_paths(dirName):       #Declare the function to return all file paths of the particular directory
    filepaths = []                      #setup file paths variable
    for root, directories, files in walk(dirName):   #Read all directory, subdirectories and file lists
        for filename in files:
            filepath = join(root, filename)     #Create the full filepath by using os module.
            filepaths.append(filepath)

    return filepaths      #return all paths

, в конце оно должно выглядеть следующим образом:

import pandas as pd
from os import walk
from os.path import join

dirName = "/your/dir"

def sample_per(df2):
    if len(df2) <= 10000:
        return df2.sample(frac=0.05)
    elif len(df2) >= 15000:
        return df2.sample(frac=0.03)
    else:
        return df2.sample(frac=0.01)


def retrieve_file_paths(dirName):       #Declare the function to return all file paths of the particular directory
    filepaths = []                      #setup file paths variable
    for root, directories, files in walk(dirName):   #Read all directory, subdirectories and file lists
        for filename in files:
            filepath = join(root, filename)     #Create the full filepath by using os module.
            filepaths.append(filepath)

    return filepaths      #return all paths

def main():
    global dirName
    for filepath in retrieve_file_paths(dirName):
        df = pd.read_excel(r+filepath)
        df2 = df.loc[(df['Track Item']=='Y')]
        final = sample_per(df2)
        df.loc[df['Retailer Item ID'].isin(final['Retailer Item ID']), 'Track Item'] = 'Audit'
        df.to_csv('Test.csv',index=False)

if __name__ == '__main__':
    main()
...