遍历目录中的多个文件

时间:2019-03-17 17:54:53

标签: python pandas

目前,我可以使用Python从文件夹中抓取一个excel文件;在下面的代码中..并通过硒将其推送到网络表单。

但是,我正在尝试对此进行修改,以继续在多个文件上通过目录。 (我的“目录”或“文件夹”中将有许多excel文件。)

main.py


from data.find_pending_records import FindPendingRecords
from vital.vital_entry import VitalEntry

if __name__ == "__main__":
    try: 
        #Instantiates FindPendingRecords then gets records to process
        PENDING_RECORDS = FindPendingRecords().get_excel_data()

        #Reads excel to map data from excel to vital
        MAP_DATA = FindPendingRecords().get_mapping_data()

        #Configures Driver for vital
        VITAL_ENTRY = VitalEntry()

        #Start chrome and navigate to vital website
        VITAL_ENTRY.instantiate_chrome()

        #Begin processing Records
        VITAL_ENTRY.process_records(PENDING_RECORDS, MAP_DATA)

        print("All done, Bill")
    except Exception as exc:
        print(exc)

config.py

FILE_LOCATION = r"C:\Zip\2019.02.12 Data Docs.zip"
UNZIP_LOCATION = r"C:\Zip\Pending"
VITAL_URL = 'http://boringdatabasewebsite:8080/Horrible'
HEADLESS = False
PROCESSORS = 4
MAPPING_DOC = ".//map/mapping.xlsx"

find_pending_records.py


"""Module used to find records that need to be inserted into Horrible website"""
from zipfile import ZipFile
import math
import pandas
import config

class FindPendingRecords:
    """Class used to find records that need to be inserted into Site"""

    @classmethod
    def find_file(cls):
        """"Finds the excel file to process"""
        archive = ZipFile(config.FILE_LOCATION)
        for file in archive.filelist:
            if file.filename.__contains__('Horrible Data Log '):
                return archive.extract(file.filename, config.UNZIP_LOCATION)

        return FileNotFoundError

    def get_excel_data(self):
        """Places excel data into pandas dataframe"""
        excel_data = pandas.read_excel(self.find_file())

        columns = pandas.DataFrame(columns=excel_data.columns.tolist())
        excel_data = pandas.concat([excel_data, columns])

        excel_data.columns = excel_data.columns.str.strip()
        excel_data.columns = excel_data.columns.str.replace("/", "_")
        excel_data.columns = excel_data.columns.str.replace(" ", "_")

        num_valid_records = 0

        for row in excel_data.itertuples():
            person = row.PERSON

            if person in ("", " ", None) or math.isnan(mrn):
                print(f"Invalid record: {row}")
                excel_data = excel_data.drop(excel_data.index[row.Index])
            else:
                num_valid_records += 1

        print(f"Processing #{num_valid_records} records")

        return self.clean_data_frame(excel_data)

    def clean_data_frame(self, data_frame):
        """Cleans up dataframes"""
        for col in data_frame.columns:
            if "date" in col.lower():
                data_frame[col] = pandas.to_datetime(data_frame[col],
                                                     errors='coerce', infer_datetime_format=True)
                data_frame[col] = data_frame[col].dt.date
        data_frame['PERSON'] = data_frame['PERSON'].astype(int).astype(str)

        return data_frame

    def get_mapping_data(self):
        map_data = pandas.read_excel(config.MAPPING_DOC, sheet_name='main')
        columns = pandas.DataFrame(columns=map_data.columns.tolist())
        return pandas.concat([map_data, columns])

1 个答案:

答案 0 :(得分:1)

一种方法如下(伪代码)

class FindPendingRecords:
    @classmethod
    def find_file(cls):
        return ["file1", "file2", "file3"]

    def __init__(self):
        self.files = self.find_file()

    def get_excel_data(self):
        for excel_data in self.files:
            # process your excel_data
            yield excel_data

您的主体应该是

if __name__ == "__main__":
    try: 
        for PENDING_RECORDS in FindPendingRecords().get_excel_data():
            # Do operations on PENDING_RECORDS
            print (PENDING_RECORDS)     
        print("All done, Bill")
    except Exception as exc:
        print(exc)

您的find_file方法将

@classmethod
def find_file(cls):
    all_files = list()
    """"Finds the excel file to process"""
    archive = ZipFile(config.FILE_LOCATION)
    for file in archive.filelist:
        if file.filename.__contains__('Horrible Data Log '):
            all_files.append(archive.extract(file.filename, config.UNZIP_LOCATION))
    return all_files