在 Python 中的已更改子目录中查找文件

Find files within a changed subdirectory in Python

我有一个充满文件名的文本文件。喜欢:

C:\Folder\Subfolder_01\file_1001.csv
C:\Folder\Subfolder_02\file_3030.xls
...

我想检查文件是否仍然存在(这很容易)或者子文件夹的名称是否已更改。通过在其前面添加一些字符串来更改某些子文件夹的名称(以 4 位数字开头,例如 C:\Folder\Subfolder_02\file_3030.xls 已更改为 C:\Folder19 - Subfolder_02\file_3030.xls)。

我试图用 pathlib.glob() 解决这个问题。可以对一个特定文件执行此操作 'by hand' like

list(file.parent.parent.glob('* - Subfolder_02\file_3030.xls'))

其中 returns 包含新文件名的列表。但是我没能在带参数的 glob 周围的循环中做到这一点。

这是我目前得到的结果,但由于显而易见的原因,我尝试将 glob 与其他变量(使用 +)连接失败:

import pathlib

file = pathlib.Path(file_names.txt)
lines=[]

with open(file,'r') as f:
    # reading the txt-file line by line         
    for line in f:
        line = line.replace("\r", "").replace("\n", "")
        lines.append(line)

for file in lines:
    file = pathlib.Path(file)
    # check if file exists ...
    if file.exists():
        print('OK - ' + file.name)
    # ... if not, find new location
    else:
        new_files = list(file.parent.parent.glob('* - ') + file.name)
        print(files_files)  

如果您在原始位置找不到文件,我会将您的顶级目录设置为一个路径,并使用它来 glob 目录下的文件。在 glob 中使用 ** 将搜索所有文件夹。

# Set top level directory as desired.
parent_dir = Path('.')

# you can use splitlines() to parse the file into a list
with Path('file_names.txt').open() as f:
    files = f.read().splitlines()

for f in files:
    orig = Path(f)

    # Still in location, no need to look further
    if orig.exists():
        print(f"{orig.absolute()} is still in place.")
        continue

    # See if we can find it under parent_dir
    matches = [*parent_dir.glob(f"**/{orig.name}")]

    if len(matches) > 1:
        print("Multiple Matches Found")

    for match in matches:
        print(f"{orig.absolute()} might be in {match.absolute()}")

尝试watchdog

例如:

import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

RESOURCES_PATH = "C:\Folder"

class dirs_watcher(FileSystemEventHandler):

    def __init__(self):
        self.observe()
        self.cur_dirs = os.listdir(RESOURCES_PATH)

    def observe(self):
        self.observer = Observer()
        self.my_watch = self.observer.schedule(self, path=RESOURCES_PATH, recursive=True)
        self.observer.start()

    def on_modified(self, event=None):
        # A folder was modified:
        self.new_dirs = os.listdir(RESOURCES_PATH)
        old = set(self.cur_dirs) - set(self.new_dirs)
        new = set(self.new_dirs) - set(self.cur_dirs)
        print("{} changed to {}".format(old, new))

        self.cur_dirs = self.new_dirs # update cur_dirs


on_modified 当子目录改变时会被触发,你可以通过保留子目录列表来提取改变的文件夹名称