如何找到给定文件的路径?

12

我有一个文件,例如“something.exe”,我想找到这个文件的路径。
在Python中我该怎么做?

6个回答

23

也许os.path.abspath()可以解决这个问题:

import os
print os.path.abspath("something.exe")
如果你的 `something.exe` 不在当前目录,你可以传递任何相对路径,`abspath()` 将解析它。

20

使用os.path.abspath获取路径名的规范化绝对路径版本,
使用os.walk获取它的位置。

import os
exe = 'something.exe'
#if the exe just in current dir
print os.path.abspath(exe)
# output
# D:\python\note\something.exe

#if we need find it first
for root, dirs, files in os.walk(r'D:\python'):
    for name in files:
        if name == exe:
            print os.path.abspath(os.path.join(root, name))

# output
# D:\python\note\something.exe

9
如果您完全不知道它在哪里,唯一的方法是从根目录c:\开始查找。
import os
for r,d,f in os.walk("c:\\"):
    for files in f:
         if files == "something.exe":
              print os.path.join(r,files)

如果您知道只有几个地方存储了您的exe文件,比如system32目录,则可以从那里开始查找。您还可以利用os.environ["PATH"],如果您总是将.exe文件放在PATH变量中的其中一个目录中。

for p in  os.environ["PATH"].split(";"):
    for r,d,f in os.walk(p):
        for files in f:
             if files == "something.exe":
                 print os.path.join(r,files)

1

只是提一下,实现这个任务的另一个选项可能是使用subprocess模块,帮助我们在终端执行命令,像这样:

import subprocess

command = "find"
directory = "/Possible/path/"
flag = "-iname"
file = "something.foo"
args = [command, directory, flag, file]
process = subprocess.run(args, stdout=subprocess.PIPE)
path = process.stdout.decode().strip("\n")
print(path)

使用这个方法,我们模拟将以下命令传递给终端:find /Posible/path -iname "something.foo"。然后,鉴于属性stdout是二进制字符串,我们需要对其进行解码,并删除末尾的"\n"字符。
我在spyder中使用%timeit魔法测试了它,性能比os.walk()选项慢了0.3秒。
我注意到你在Windows上,所以你可以搜索一个类似于Unix的find命令的命令。
最后,如果您有多个具有相同名称的文件在不同的目录中,生成的字符串将包含所有这些文件。因此,您需要适当处理它,可能使用正则表达式。

1

这是一个非常老的帖子,但对于那些偶然发现它的人可能会很有用。在Python 3中,有一个名为“glob”的模块,它采用“egrep”样式的搜索字符串并返回适合系统的路径(即Unix \ Linux和Windows)。

https://docs.python.org/3/library/glob.html

一个例子的用法是:

results = glob.glob('./**/FILE_NAME')

然后,您将在result变量中获得匹配项列表。

0

嗯...这个问题有点不清楚。

你说的“有”是什么意思?你有文件的名称吗?你打开了它吗?它是一个文件对象吗?还是一个文件描述符?什么?

如果它是一个名称,那么“找到”是什么意思?你想在一堆目录中搜索文件吗?还是你知道它在哪个目录中?

如果它是一个文件对象,那么你必须已经合理地打开了它,然后你已经知道路径了,虽然你也可以从fileob.name中获取文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接