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)
Любые другие предложения?
Спасибо
Ответы
Ответ 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)