抓取文件夹中的下一个.zip文件(通过zip目录迭代)

时间:2019-04-03 19:33:34

标签: python

下面是我最近的尝试;但是 alas ,我打印'current_file',并且它总是相同(第一个).zip 文件在我的目录中?

为什么/如何重复此操作以获取zip目录中的下一个文件?

我的DIRECTORY_LOCATION中有4个zip文件。

def find_file(cls):

    listOfFiles = os.listdir(config.DIRECTORY_LOCATION)  
    total_files = 0
    for entry in listOfFiles:
        total_files += 1  
        # if fnmatch.fnmatch(entry, pattern):
        current_file = entry
        print (current_file)

        """"Finds the excel file to process"""
        archive = ZipFile(config.DIRECTORY_LOCATION + "/" + current_file)
        for file in archive.filelist:
            if file.filename.__contains__('Contact Frog'):
                return archive.extract(file.filename, config.UNZIP_LOCATION)

    return FileNotFoundError

查找文件的用法:

excel_data = pandas.read_excel(self.find_file())

更新

我只是尝试将收益率更改为:

yield archive.extract(file.filename, config.UNZIP_LOCATION)

,现在在我的find_file行出现以下错误。

ValueError: Invalid file path or buffer object type: <class 'generator'>

然后按照注释中的建议使用生成器obj进行更改;即:

generator = self.find_file(); excel_data = pandas.read_excel(generator())

现在出现此错误:

    generator = self.find_file(); excel_data = pandas.read_excel(generator())
TypeError: 'generator' object is not callable

如果有帮助,这是我的 /main.py

"""Start Point"""
from data.find_pending_records import FindPendingRecords
from vital.vital_entry import VitalEntry
import sys
import os
import config
import datetime
# from csv import DictWriter

if __name__ == "__main__":
    try:
        for file in os.listdir(config.DIRECTORY_LOCATION):
            if 'VCCS' in file:
                PENDING_RECORDS = FindPendingRecords().get_excel_data()
                # Do operations on PENDING_RECORDS
                # Reads excel to map data from excel to vital
                MAP_DATA = FindPendingRecords().get_mapping_data()
                # Configures Driver
                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)
    except:
        print("exception occured")
        raise

1 个答案:

答案 0 :(得分:1)

未经测试。

def find_file(cls):
    listOfFiles = os.listdir(config.DIRECTORY_LOCATION)  
    total_files = 0
    for entry in listOfFiles:
        total_files += 1  
        # if fnmatch.fnmatch(entry, pattern):
        current_file = entry
        print (current_file)

        """"Finds the excel file to process"""
        archive = ZipFile(config.DIRECTORY_LOCATION + "/" + current_file)
        for file in archive.filelist:
            if file.filename.__contains__('Contact Frog'):
                yield archive.extract(file.filename, config.UNZIP_LOCATION)

这只是用yield而不是return重写的函数。

我认为应该以下列方式使用它:

for extracted_archive in self.find_file():
    excel_data = pandas.read_excel(extracted_archive)
    #do whatever you want to do with excel_data here

self.find_file()是一个生成器,应像迭代器一样使用(read this answer了解更多信息)。

尝试将上一个循环集成到您的主脚本中。循环的每次迭代都会在excel_data中读取一个不同的文件,因此在循环的主体中,您还应该执行与数据有关的所有操作。

不确定您的意思是什么

  

每次执行脚本一次

即使使用yield,如果多次执行脚本,也总是从头开始(总是得到第一个文件)。您应该在同一执行中读取所有文件。