Найти файлы в измененном подкаталоге в Python - PullRequest
0 голосов
/ 16 января 2020

У меня есть текстовый файл, полный имен файлов. Например:

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

Я хочу проверить, существуют ли файлы (это легко) или имя подпапки изменилось. Имя некоторых подпапок изменилось путем добавления некоторой строки перед ним (начиная с числа 4 di git, например, C:\Folder\Subfolder_02\file_3030.xls изменилось на C:\Folder\2019 - Subfolder_02\file_3030.xls).

Я пытался решить эту проблему с помощью pathlib.glob(). Это можно сделать для одного указанного c файла «вручную», например

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

, который возвращает список с новым именем файла. Но мне не удалось сделать это в al oop, окружающем 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)  

Ответы [ 2 ]

1 голос
/ 16 января 2020

Я бы установил ваш верхний каталог в качестве пути и использовал его для перемещения файлов в этом каталоге, если вы не можете найти файл в его первоначальном расположении. Использование ** в глобусе будет искать все папки.

# 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()}")
0 голосов
/ 16 января 2020

Попробуйте сторожевой таймер

Например:

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 будет срабатывать при изменении подкаталога, и вы можете извлечь имена измененных папок, сохраняя список подкаталогов

...