如何在python中检查文件夹中是否有新文件

问题描述 投票:0回答:4

我正在尝试创建一个每 10 分钟执行一次的脚本。每次我都必须检查计算机中的特定文件夹中是否有新文件,如果有,则会在该文件上运行一些函数以获得一些值。这些值将被写入 Excel 文件。问题是,每次执行该函数时,都会再次生成包含所有文件路径的变量,并且程序将遍历所有文件。我该如何处理这个问题? 谢谢

python automation schedule
4个回答
10
投票
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()
  1. pip 安装看门狗
  2. 在任务计划程序中为此脚本创建计划任务,并监视将在其中创建文件的文件夹。

5
投票

从初始化变量开始:

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

3
投票
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


1
投票

首先,在您的目录中首次运行此脚本以创建一个“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')
© www.soinside.com 2019 - 2024. All rights reserved.