下面是我最近的尝试;但是 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
答案 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
,如果多次执行脚本,也总是从头开始(总是得到第一个文件)。您应该在同一执行中读取所有文件。