如何在Python中获取文件的绝对路径?

时间:2014-05-16 13:48:19

标签: python dictionary absolute-path os.path

我在网站上看到了很多链接,说使用“os.path.abspath(#filename)”。这种方法并不适合我。我正在编写一个程序,能够在给定目录中搜​​索具有特定扩展名的文件,将名称和绝对路径作为键和值(分别)保存到字典中,然后使用绝对路径打开文件并制作编辑是必需的。我遇到的问题是,当我使用os.path.abspath()时,它不会返回完整路径。

假设我的程序在桌面上。我有一个存储在“C:\ Users \ Travis \ Desktop \ Test1 \ Test1A \ test.c”的文件。我的程序可以很容易地找到这个文件,但是当我使用os.path.abspath()它返回“C:\ Users \ Travis \ Desktop \ test.c”这是我的源代码存储的绝对路径,但不是我正在搜索的文件。

我的确切代码是:

import os
Files={}#Dictionary that will hold file names and absolute paths
root=os.getcwd()#Finds starting point
for root, dirs, files in os.walk(root):
    for file in files:
        if file.endswith('.c'):#Look for files that end in .c
            Files[file]=os.path.abspath(file)

有关为什么会这样做以及如何解决问题的任何提示或建议?提前谢谢!

3 个答案:

答案 0 :(得分:4)

os.path.abspath()使相对路径绝对相对于当前工作目录,而不是文件的原始位置。路径只是一个字符串,Python无法知道文件名的来源。

您需要自己提供目录。当您使用os.walk时,每次迭代都会列出列出的目录(代码中为root),子目录列表(只是它们的名称)和文件名列表(再次,只是它们的名称)。将root与文件名一起使用以创建绝对路径:

Files={}
cwd = os.path.abspath(os.getcwd())
for root, dirs, files in os.walk(cwd):
    for file in files:
        if file.endswith('.c'):
            Files[file] = os.path.join(root, os.path.abspath(file))

请注意,您的代码仅记录每个唯一文件名的一个路径;如果您有foo/bar/baz.cfoo/spam/baz.c,则取决于操作系统列出barspam子目录的顺序,其中两个路径中的一个获胜。

您可能希望将路径收集到列表中:

Files={}
cwd = os.path.abspath(os.getcwd())
for root, dirs, files in os.walk(cwd):
    for file in files:
        if file.endswith('.c'):
            full_path = os.path.join(root, os.path.abspath(file))
            Files.setdefault(file, []).append(full_path)

答案 1 :(得分:0)

the docs for os.path.join

  

如果任何组件是绝对路径,则所有先前组件(打开   Windows,包括之前的驱动器号,如果有的话)   扔掉了

因此,例如,如果第二个参数是绝对路径,则第一个路径'/a/b/c'将被丢弃。

In [14]: os.path.join('/a/b/c', '/d/e/f')
Out[14]: '/d/e/f'

因此,

os.path.join(root, os.path.abspath(file))

将丢弃root,无论它是什么,并将os.path.abspath(file)返回到当前工作目录file,这不一定与{{1}相同}。

相反,要形成文件的绝对路径:

root

实际上,我认为fullpath = os.path.abspath(os.path.join(root, file)) 是不必要的,因为我相信os.path.abspath永远是绝对的,但我的理由取决于the source code for os.walk而不仅仅是{{3}}的记录(保证)行为root。因此,为了绝对确定(双关语),请使用os.walk


os.path.abspath

答案 2 :(得分:-1)

Glob在这些情况下很有用,你可以这样做:

files = {f:os.path.join(os.getcwd(), f) for f in glob.glob("*.c")}

获得相同的结果