【发布时间】:2012-04-06 16:36:09
【问题描述】:
如何获取 Python 中可能包含多个子文件夹的目录中所有文件的绝对路径?
我知道os.walk() 递归地给了我一个目录和文件的列表,但这似乎并没有让我得到我想要的。
【问题讨论】:
-
你能举例说明你期望的输入和输出吗
标签: python absolute-path
如何获取 Python 中可能包含多个子文件夹的目录中所有文件的绝对路径?
我知道os.walk() 递归地给了我一个目录和文件的列表,但这似乎并没有让我得到我想要的。
【问题讨论】:
标签: python absolute-path
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 次更好
os.path.join 的合同,如果其中一个论点是,我找不到任何地方可以保证结果是绝对的,尽管这是一个明智的假设。
os.path.join的源码,简洁明了。
所有文件和文件夹:
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'))]
【讨论】:
从 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
【讨论】:
试试:
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。
list,过滤器返回一个生成器。
如果给os.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))
【讨论】:
for root, directories, filenames in os.walk(directory):
for directory in directories:
print os.path.join(root, directory)
for filename in filenames:
if filename.endswith(".JPG"):
print filename
print os.path.join(root,filename)
【讨论】:
from glob import glob
def absolute_file_paths(directory):
return glob(join(directory, "**"))
【讨论】:
os 模块导入 join 时才有效,例如:from os.path import join。不递归处理文件夹。
如果您有 Python 3.4 或更高版本,您可以使用 pathlib(如果您有旧 Python 版本,则可以使用第三方向后移植):
import pathlib
for filepath in pathlib.Path(directory).glob('**/*'):
print(filepath.absolute())
【讨论】:
我想保留子目录的详细信息而不是文件,并且只想要包含一个 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
【讨论】:
可以使用os.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)))
【讨论】:
folder时,这不是加入cwd到filename吗?!
试试:
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('.')