在 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
当子目录改变时会被触发,你可以通过保留子目录列表来提取改变的文件夹名称
我有一个充满文件名的文本文件。喜欢:
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
当子目录改变时会被触发,你可以通过保留子目录列表来提取改变的文件夹名称