Python 获取目录中所有文件的绝对路径
如何获取Python中可能有多个子文件夹的目录中所有文件的绝对路径 我知道Python 获取目录中所有文件的绝对路径,python,absolute-path,Python,Absolute Path,如何获取Python中可能有多个子文件夹的目录中所有文件的绝对路径 我知道os.walk()递归地给我一个目录和文件列表,但这似乎并不能满足我的需要 如果给定给的参数是绝对的,那么在迭代过程中生成的根目录名称也将是绝对的。因此,您只需使用以下文件名将它们连接起来: import os for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")): for file in files: print
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))
您可以使用
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)))
确保路径是绝对的。使用以下辅助函数:
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))
尝试:
我希望保留子目录的详细信息,而不是文件,并且只希望子目录中有一个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
如果您有Python 3.4或更新版本,则可以使用(如果您有较旧的Python版本,则可以使用第三方后端口):
从全局导入全局
def绝对文件路径(目录):
返回全局(加入(目录“**”)
所有文件和文件夹:
x=[os.path.abspath(os.path.join(directory,p))代表os.listdir(directory)中的p]
图像(.jpg |.png):
x=[os.path.abspath(os.path.join(directory,p)),如果p.endswith(('jpg','png'))在os.listdir(directory)中为p
试试:
从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文档:
您能举例说明您期望的输入和输出是什么吗?当您想加入
文件夹时,是否将cwd
加入filename
?!我认为在os.walk
行上只做一次ABSPACH比在有效的循环中做N次要好,但这只是“意外”。阅读os.path.join
的契约,我找不到任何地方可以保证结果是绝对的,如果其中一个参数是绝对的,尽管这是一个合理的假设。结尾有一个多余的括号。应该是yield os.path.abspath(os.path.join(dirpath,f))@jumbopp谢谢你的提示,修复了。@phihag这很可靠。这不是“意外”,语言也不太正式,文件中没有“合同”的概念。有文档记载,如果一个组件是绝对路径,那么之前的所有组件都将被丢弃,并从绝对路径组件继续连接。Python无法在这里无形地转换为相对路径,如果不进行巨大的向后破坏性更改,就不可能修改行为。如果仍然不确定,您甚至可以阅读os.path.join
的源代码,它既短又简单。是否要在不捕获隐藏文件的情况下执行此操作?@MarcelMarino如果不是file.startswith('.')
好的,我明白您的意思,只是我不想要这些文件,而是想要特定的子目录。我已经发布了下面的解决方案。虽然这个代码可能会回答这个问题,但是你仍然可以考虑添加一些解释性的句子,因为这会增加你的答案对其他用户的价值。这只在你从<代码> OS > /COD>模块中导入“代码>连接< /代码>时才起作用,就像这样:<代码>从OS.Purress导入连接< /代码>。不会递归地创建文件夹。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案。这非常好,因为它使用了python 3,但也显示了目录。如何确保这一行程序中只有文件而不是目录?您的import语句直接导入Path
,然后在代码中调用pathlib.Path()
。除非修复,否则当前不会运行。马丁·马丁:谢谢你指出这一点。我已经更新了代码。在本例中,不需要从这些文件中生成list
,filter返回一个生成器。@MaLiN2223:是的,但我想存储文件列表,因为当生成器耗尽时,文件将不会给出任何结果。无论如何,我已经更新了我的答案:)
import pathlib
for filepath in pathlib.Path(directory).glob('**/*'):
print(filepath.absolute())
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 pathlib import Path
path = 'Desktop'
files = filter(lambda filepath: filepath.is_file(), Path(path).glob('*'))
for file in files:
print(file.absolute())
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()]