2016-08-12 6 views
2

Я пытаюсь указать имена каталогов, к которым принадлежит определенный файл. Ниже приведен пример моего файла дерева:Как получить родительский каталог и подкаталог для файла

root_folder 
├── topic_one 
│   ├── one-a.txt 
│   └── one-b.txt 
└── topic_two 
    ├── subfolder_one 
    │   └── sub-two-a.txt 
    ├── two-a.txt 
    └── two-b.txt 

В идеале, я хотел бы быть распечатаны является:

"File: file_name belongs in parent directory" 
"File: file_name belongs in sub directory, parent directory" 

Я написал этот сценарий:

for root, dirs, files in os.walk(root_folder): 

# removes hidden files and dirs 
    files = [f for f in files if not f[0] == '.'] 
    dirs = [d for d in dirs if not d[0] == '.'] 

    if files: 
     tag = os.path.relpath(root, os.path.dirname(root)) 
     for file in files: 
      print file, "belongs in", tag 

, который дает меня этот выход:

one-a.txt belongs in topic_one 
one-b.txt belongs in topic_one 
two-a.txt belongs in topic_two 
two-b.txt belongs in topic_two 
sub-two-a.txt belongs in subfolder_one 

Я не могу em, чтобы выяснить, как получить родительский каталог, включенный для файла в подкаталог. Любая помощь или альтернативные методы были бы весьма полезны.

+0

[питон документ] (https://docs.python.org/3.4/library/os. path.html # os.path.relpath) говорит, что relpath принимает первый аргумент в качестве цели, а второй arg - как источник. В вашем посте вы сравниваете 'root' с самим собой, но вы должны делать' relpath (root, root_folder) ' – user1040495

+0

И для печати вы можете использовать' tag.replace (os.path.sep, ',') ' – user1040495

+0

Спасибо! Это очень близко. Я получаю этот 'sub-two-a.txt принадлежит в topic_two/subfolder_one, topic_two'. Есть ли способ удалить 'topic_two /' для распечатки подкаталога? – AldoTheApache

ответ

0

Благодаря Jean-François Fabre и Jjpx для этого решения:

for root, dirs, files in os.walk(root_folder): 

    # removes hidden files and dirs 
    files = [f for f in files if not f[0] == '.'] 
    dirs = [d for d in dirs if not d[0] == '.'] 

    if files: 
     tag = os.path.relpath(root, root_folder) 

     for file in files: 
      tag_parent = os.path.dirname(tag) 

      sub_folder = os.path.basename(tag) 

      print "File:",file,"belongs in",tag_parent, sub_folder if sub_folder else "" 

распечатывает:

File: one-a.txt belongs in topic_one 
File: one-b.txt belongs in topic_one 
File: two-a.txt belongs in topic_two 
File: two-b.txt belongs in topic_two 
File: sub-two-a.txt belongs in topic_two subfolder_one 
+0

В настоящее время 'root' уже содержит относительный путь от' root_folder' до 'file'. Для более глубоких файлов лучше всего «распечатать» Файл: «, file», «принадлежит», «,». Join (root.split (os.path.sep)) ' – user1040495

+0

, если ваш ответ решает вашу проблему, отметьте его как принято – user1040495

Смежные вопросы