Python的watchdog模块可以监视一个目录,并在文件发生修改时重命名文件。
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'
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
感谢你的帮助,这个方法非常有效。希望其他人也会觉得有用!