我正在寻找一种获取特定文件夹中文件和(子)文件夹的相对路径的好方法。
对于我目前的方法,我使用的是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)
还有其他建议吗?
由于
答案 0 :(得分:62)
使用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上受支持。
答案 1 :(得分:9)
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 ))
答案 2 :(得分:3)
我认为os.walk是正确的选择。
也许root.replace(myFolder, "")
应该更改为root.replace(myFolder, "", 1)
以避免潜在的......你知道。
如果您已经获得了文件和(子)文件夹,os.path.commonprefix也值得一看。
答案 3 :(得分:2)
这可能是说实话的最佳方式:你可以使用glob
来减少一定数量的图层,但如果你需要它递归,你必须walk
。
答案 4 :(得分:2)
你所做的是完全正确的,我认为应该这样做,但只是为了替代,这是一次尝试
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
答案 5 :(得分:1)
如果您只是在寻找解决方案的替代方案,也可以使用os.listdir()。
但基本上逻辑将保持不变:迭代文件 - 如果目录,遍历子目录。
答案 6 :(得分:0)
我是这样做的:
add()