如何在Python中获取目录中所有文件的绝对路径,而该目录可能有许多子文件夹?
我知道os.walk()
可以递归地给出目录和文件的列表,但似乎无法得到我想要的结果。
如何在Python中获取目录中所有文件的绝对路径,而该目录可能有许多子文件夹?
我知道os.walk()
可以递归地给出目录和文件的列表,但似乎无法得到我想要的结果。
os.path.abspath
确保路径是绝对路径。使用以下辅助函数:
import os
def absoluteFilePaths(directory):
for dirpath,_,filenames in os.walk(directory):
for f in filenames:
yield os.path.abspath(os.path.join(dirpath, f))
os.walk
行中执行一次abspath
比在循环内部执行N次更好。 - wimos.path.join
的合同,我找不到任何保证结果是绝对路径的地方,即使其中一个参数是绝对路径,尽管这是一个明智的假设。 - phihagos.path.join
的源代码,它很短而简单。 - wimos.walk
的参数是绝对路径,则迭代期间生成的根目录名称也将是绝对路径。因此,您只需将它们与文件名连接即可:import os
for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")):
for file in files:
print(os.path.join(root, file))
尝试:
import os
for root, dirs, files in os.walk('.'):
for file in files:
p=os.path.join(root,file)
print p
print os.path.abspath(p)
print
if not file.startswith('.')
如果文件名不以'.'开头,则执行该操作。 - A.Wanos.path.abspath()
将相对路径转换为绝对路径:file_paths = []
for folder, subs, files in os.walk(rootdir):
for filename in files:
file_paths.append(os.path.abspath(os.path.join(folder, filename)))
cwd
与 filename
连接起来吗?你想要连接的是 folder
吧! - wim从Python 3.5开始,惯用的解决方案是:
import os
def absolute_file_paths(directory):
path = os.path.abspath(directory)
return [entry.path for entry in os.scandir(path) if entry.is_file()]
这不仅读起来更加流畅,而且在许多情况下也更快。 有关更多详细信息(如忽略符号链接),请参阅原始的Python文档: https://docs.python.org/3/library/os.html#os.scandir
所有文件和文件夹:
x = [os.path.abspath(os.path.join(directory, p)) for p in os.listdir(directory)]
图片(.jpg | .png):
x = [os.path.abspath(os.path.join(directory, p)) for p in os.listdir(directory) if p.endswith(('jpg', 'png'))]
from glob import glob
def absolute_file_paths(directory):
return glob(join(directory, "**"))
os
模块导入join
时,它才能正常工作,如下所示:from os.path import join
。不会递归地处理文件夹。 - martin-martin尝试:
from pathlib import Path
path = 'Desktop'
files = filter(lambda filepath: filepath.is_file(), Path(path).glob('*'))
for file in files:
print(file.absolute())
Path
,但是在代码中却调用了 pathlib.Path()
。除非你修复这个问题,否则代码无法运行。不过,@Pygirl 的解决方案很好且干净。 - martin-martinlist
,filter返回一个生成器。 - MaLiN2223我想保留子目录的详细信息,但不要包含文件,只需要其中有一个 xml 文件的子目录。可以这样实现:
for rootDirectory, subDirectories, files in os.walk(eventDirectory):
for subDirectory in subDirectories:
absSubDir = os.path.join(rootDirectory, subDirectory)
if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1:
print "Parsing information in " + absSubDir