Подтвердить что ты не робот

Python - получить относительный путь для всех файлов и подпапок в каталоге

Я ищу хороший способ получить относительные пути файлов и (под) папок в определенной папке.

Для моего текущего подхода я использую os.walk(). Он работает, но мне это не кажется "pythonic":

myFolder = "myfolder"
fileSet = set() # yes, I need a set()

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add(root.replace(myFolder, "") + os.sep + fileName)

Любые другие предложения?

Спасибо

4b9b3361

Ответ 1

Используйте os.path.relpath(). Это как раз его предполагаемое использование.

import os
root_dir = "myfolder"
file_set = set()

for dir_, _, files in os.walk(root_dir):
    for file_name in files:
        rel_dir = os.path.relpath(dir_, root_dir)
        rel_file = os.path.join(rel_dir, file_name)
        file_set.add(rel_file)

Обратите внимание, что os.path.relpath() был добавлен в Python 2.6 и поддерживается в Windows и Unix.

Ответ 2

myFolder = "myfolder"
fileSet = set() 

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add( os.path.join( root[len(myFolder):], fileName ))

Ответ 3

Я думаю, что os.walk - правильный выбор здесь. возможно, root.replace(myFolder, "") должен измениться на root.replace(myFolder, "", 1), чтобы избежать потенциального sth. вы знаете. Если вы уже получаете файлы и (под) папки, os.path.commonprefix тоже выглядят.

Ответ 4

Это, вероятно, лучший способ быть честным: вы можете использовать glob для перехода к определенному числу слоев вниз, но если вам нужно, чтобы он был рекурсивным, вы должны walk.

Ответ 5

То, что вы делаете, совершенно правильно, и я думаю, что так должно быть сделано, НО только ради альтернативы, вот попытка

import os

def getFiles(myFolder):
    old = os.getcwd()
    os.chdir(myFolder)

    fileSet = set()

    for root, dirs, files in os.walk(""):
        for f in files:
            fileSet.add(os.path.join(root, f))

    os.chdir(old)
    return fileSet

Ответ 6

Вы также можете использовать os.listdir(), если вы просто ищете альтернативу вашему решению.

Но в основном логика останется прежней: итерация по файлам - если каталог, итерация через подкаталог.

Ответ 7

Я сделал это так:

import pathlib

def find_path_to_file(file_name):
    globa_path = pathlib.Path.home()
    for path in sorted(globa_path.rglob('*')):
            if str(file_name) in str(path):
                return str(path)