【发布时间】:2009-07-14 11:30:36
【问题描述】:
我有一个文件,例如“something.exe”,我想找到该文件的路径
我如何在 python 中做到这一点?
【问题讨论】:
标签: python
我有一个文件,例如“something.exe”,我想找到该文件的路径
我如何在 python 中做到这一点?
【问题讨论】:
标签: python
也许os.path.abspath() 会这样做:
import os
print os.path.abspath("something.exe")
如果您的something.exe 不在当前目录中,您可以传递任何相对路径,abspath() 将解决它。
【讨论】:
使用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
【讨论】:
如果你完全不知道它在哪里,唯一的办法就是从根目录 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,然后从那里开始查找它。如果您始终将 .exe 放在 PATH 变量中的这些目录之一中,您也可以使用 os.environ["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)
【讨论】:
顺便提一下,实现此任务的另一个选项可能是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 的命令。
最后,如果您在不同目录中有多个同名文件,则生成的字符串将包含所有这些文件。因此,您需要适当地处理它,也许使用正则表达式。
【讨论】:
呃……这个问题有点不清楚。
“拥有”是什么意思?你有文件名吗?你打开了吗?它是一个文件对象吗?它是文件描述符吗?什么???
如果是名称,“查找”是什么意思?你想在一堆目录中搜索文件吗?或者你知道它在哪个目录?
如果它是一个文件对象,那么你一定已经合理地打开了它,然后你已经知道了路径,尽管你也可以从 fileob.name 中获取文件名。
【讨论】:
这是一个非常老的线程,但可能对偶然发现它的人有用。在 python 3 中,有一个名为“glob”的模块,它采用“egrep”样式搜索字符串并返回系统适当的路径(即 Unix\Linux 和 Windows)。
https://docs.python.org/3/library/glob.html
示例用法如下:
results = glob.glob('./**/FILE_NAME')
然后你会在结果变量中得到一个匹配列表。
【讨论】: