Рекурсивно изменить каталог python - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь написать программу, которая может переименовывать каталоги на основе определенного ключевого слова, которое появляется внутри текстовых файлов внутри каждого из каталогов после части «Ключевое слово:» в файлах. Таким образом, для Case003 ниже файлы orange.txt и cow.txt содержат одно и то же ключевое слово, которое переименует их родительский каталог. Эта часть достаточно проста для выполнения, и не то, что мне сейчас нужно, но структура каталогов - это то, что мешает мне реализовать это. Это структура каталогов

   Project_Folder
    ├── Case001
    │   └── asdf422345112323423
    │       └── puppy.txt
    ├── Case002
    │   ├── jjasdfjtnqn3881847471
    │   │   └── apple.txt
    │   └── jtnjjqjqjwkwktjjthqj
    │       └── banana.txt
    └── Case003
        └── asdfasdfntjejqk21244
            ├── herwerhqkethf4443434
            │   ├── orange.txt
            │   └── cow.txt
            └── jdjdjafjejqjqyttjdjak
                └── cat.txt

Я думаю, мне нужно использовать os.walk здесь, но я борюсь с тем, как сделать так, чтобы он изменял только имя родительского каталога, так как генератор os.walk включает все каталоги и подкаталоги внутри каталога, переданного в os.walk. Есть ли хороший способ вызывать только родительские каталоги, которые содержат .txt файлов?

Если это поможет прояснить ситуацию, для Case003 вывод кода будет выглядеть так, при условии, что ключевое слово внутри текстовых файлов Plane и Island в соответствующих родительских каталогах.

    └── Case003
        └── asdfasdfntjejqk21244
            ├── Plane
            │   ├── orange.txt
            │   └── cow.txt
            └── Island
                └── cat.txt

(Древовидная диаграмма, созданная с помощью генератора дерева ASCII для Visual Studio, которую можно найти здесь

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Ознакомьтесь с документацией для os.walk. Он возвращает генератор, который дает 3 кортежа (dirpath, dirnames, filenames). Он будет рекурсивно проходить по всем подкаталогам, поэтому вам нужно только просмотреть имена файлов.

Если вы опубликуете код, который вы пытались использовать в OP, мы лучше с вами работаем.

import os

for dirpath, dirnames, filenames in os.walk('Project Folder'):
    # check the files for the keyword that you want to rename the parent to
    if filenames:
        for f in filenames:
            # read the txt file and get the keyword
            # rename the parent directory based on the keyword
            filepath = os.path.join(dirpath, f)
0 голосов
/ 26 марта 2020

Когда вы пересекаете дерево каталогов с помощью walk, у вас всегда будет полный доступный путь. Например, когда вы открываете orange.txt, у вас есть доступ к полному пути Project_Folder/Case003/asdfasdfntjejqk21244/herwerhqkethf4443434/orange.txt. Все, что вам нужно сделать, это обработать эту строку. Отрежьте имя файла и его родительский каталог, и у вас останется именно то имя каталога, которое нужно переименовать.

Можете ли вы взять его оттуда?

...