Python的watchdog模块可以监视一个目录,并在文件发生修改时重命名文件。

10 浏览
0 Comments

Python的watchdog模块可以监视一个目录,并在文件发生修改时重命名文件。

尝试深入研究classes(),我想编写一个真实的程序,以帮助我在工作中的一位同事。\n我正在使用watchdog API来监视一个文件夹,我想要的行为是,当一个文件移动到这个文件夹时,根据csv中的course_name列对其进行重命名,目前还是很简单的对吧?\n现在,当我运行上面的伪代码时,我不断收到一个FileNotFoundError的错误,但代码确实可以工作-但是API仍在搜索已删除/更改的文件?\n从我看到的情况来看,我的函数执行后有些东西正在执行,但是我无论如何都无法找出是什么?\n

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import pandas as pd
import os
from shutil import copyfile
my_path = r""
class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'event type: {event.event_type}  path : {event.src_path}')
        df = pd.read_csv(event.src_path) # 读取文件
        course = df['Course Name'].unique().tolist()[0] # 将课程名称传递给变量
        copyfile(event.src_path, f"{course}.csv") # 复制文件,使用os.rename会引发错误。
        os.remove(event.src_path) # 删除原始文件。
        print("文件重命名")

\n然后我用以下方式执行上述代码:\n

if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path=my_path, recursive=False)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
    observer.join()

\n如果需要额外的信息,请询问。\n跟踪错误非常长,我的道歉:\n

    Exception in thread Thread-8:
Traceback (most recent call last):
  File "\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "\Anaconda3\lib\site-packages\watchdog\observers\api.py", line 199, in run
    self.dispatch_events(self.event_queue, self.timeout)
  File "\Anaconda3\lib\site-packages\watchdog\observers\api.py", line 368, in dispatch_events
    handler.dispatch(event)
  File "\Anaconda3\lib\site-packages\watchdog\events.py", line 330, in dispatch
    _method_map[event_type](event)
  File "", line 13, in on_modified
    df = pd.read_csv(event.src_path)
  File "\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 702, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 429, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1122, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1853, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 387, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 705, in pandas._libs.parsers.TextReader._setup_parser_source
FileNotFoundError: [Errno 2] File b'report - Copy.csv' does not exist: b'report - Copy.csv'

0
0 Comments

Python watchdog是一个用于监视文件和目录变化的库。在使用watchdog的过程中,有一个问题是on_modified事件可能会对同一个文件触发两次。为了解决这个问题,可以使用一个deque来存储最近的事件,或者使用一个last_event变量来避免重复。如果预期会有同名输入文件,可能需要找到一种重新设置last_event的方法。

另外,在on_modified()方法中添加一个短暂的等待时间,以确保文件完全写入,可以预防意外行为,尤其是在对该文件执行操作时。

以下是一个使用last_event变量的示例代码:

import time
last_event = ''
def on_modified(self, event):
    time.sleep(1)  # 等待1秒,确保文件完全写入
    if not event.src_path == last_event:  # 对于最近未见过的文件
        # 执行某些操作
        last_event = event.src_path

另一个更简单的选择是,正确处理这个异常。以下是一个示例代码:

import pandas as pd
from shutil import copyfile
import os
class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'event type: {event.event_type}  path : {event.src_path}')
        try:
            df = pd.read_csv(event.src_path)  # 读取文件
            course = df['Course Name'].unique().tolist()[0]  # 将课程名称传递给一个变量
            copyfile(event.src_path, f"{course}.csv")  # 复制文件,使用os.rename会出现错误
            os.remove(event.src_path)  # 删除原始文件
            print("文件已重命名")
        except FileNotFoundError:
            # 处理错误
            pass

感谢你的帮助,这个方法非常有效。希望其他人也会觉得有用!

0