我在网站上看到了很多链接,说使用“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)
有关为什么会这样做以及如何解决问题的任何提示或建议?提前谢谢!
答案 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.c
和foo/spam/baz.c
,则取决于操作系统列出bar
和spam
子目录的顺序,其中两个路径中的一个获胜。
您可能希望将路径收集到列表中:
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)
如果任何组件是绝对路径,则所有先前组件(打开 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")}
获得相同的结果