我正在尝试创建一个每 10 分钟执行一次的脚本。每次我都必须检查计算机中的特定文件夹中是否有新文件,如果有,则会在该文件上运行一些函数以获得一些值。这些值将被写入 Excel 文件。问题是,每次执行该函数时,都会再次生成包含所有文件路径的变量,并且程序将遍历所有文件。我该如何处理这个问题? 谢谢
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
def on_any_event(self, event):
print(event.event_type, event.src_path)
def on_created(self, event):
print("on_created", event.src_path)
print(event.src_path.strip())
if((event.src_path).strip() == ".\test.xml"):
print("Execute your logic here!")
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
input('press Enter to quit')
observer.stop()
从初始化变量开始:
savedSet=set()
mypath=… #YOUR PATH HERE
在每个周期结束时,将一组文件名、创建时间和大小以元组格式保存到另一个变量中。检索文件时,请执行以下操作:
-检索一组文件路径
nameSet=set()
for file in os.listdir(path):
fullpath=os.path.join(mypath, file)
if os.path.isfile(fullpath):
nameSet.add(file)
-创建元组
retrievedSet=set()
for name in nameSet:
stat=os.stat(os.path.join(mypath, name))
time=ST_CTIME
#size=stat.ST_SIZE If you add this, you will be able to detect file size changes as well.
#Also consider using ST_MTIME to detect last time modified
retrievedSet.add((name,time))
-将设置与保存的设置进行比较以查找新文件
newSet=retrievedSet-savedSet
-将设置与保存的设置进行比较以查找已删除的文件
deletedSet=savedSet-retrievedSet
-在名称来自 newSet 的文件上运行您的函数 -更新保存的集合
savedSet=newSet
import operator
from stat import ST_CTIME
import os, sys, time
path = str(os.getcwd()) + '/' ; #or you can assign the return value of your
#function (the updated path as per your question)
#which operates on the file 'new_file' to this variable.
files = os.listdir(path);
def mostRecentFile(path):
all_files = os.listdir(path);
file_ctime = dict();
for file in all_files:
file_times[e] = time.time() - os.stat(e).st_ctime;
return sorted(file_times.items(), key=operator.itemgetter(1))[0][0]
new_file = mostRecentFile(path)
该代码仅返回一个文件,该文件是目录中的最新文件(根据您的要求)。变量
new_file
具有函数 mostRecentFile
返回的文件名,该文件名是变量 path
给出的当前目录中最近创建的文件名。您可以调整它来更改路径的输入方式 - 当前工作目录或更改为所需的目录。鉴于您的要求,我认为您想要当前目录,并且代码使用相同的目录。
我使用
st_ctime
考虑了创建时间。您可以通过将 st_ctime
替换为 st_mtime
来使用修改时间。
您可以将这个新创建的文件
new_file
传递给您的函数,并将该函数生成的新路径分配给变量 path
。
首先,在您的目录中首次运行此脚本以创建一个“files”文件
import os
import pandas as pd
list_of_files=os.listdir()
list_of_files.append('files.csv')
pd.DataFrame({'files':list_of_files}).to_csv('files.csv')
然后在你的主脚本中添加以下内容:
import pandas as pd
import os
files=pd.read_csv('files.csv')
list_of_files=os.listdir()
if len(files.files)!=len(list_of_files):
#do what you want
#save your excel with the name sample.xslx
#append your excel into list of files and get the set so you will not have the sample.xlsx twice if run again
list_of_files.append('sample.xslx')
list_of_files=list(set(list_of_files))
#save again the curent list of files
pd.DataFrame({'files':list_of_files}).to_csv('files.csv')