打开文件资源管理器

104

在Python中,如何跳转到Windows资源管理器中的文件?我找到了一个跳转到文件夹的解决方案:

import subprocess
subprocess.Popen('explorer "C:\path\of\folder"')

但是我对文件没有解决方案。

11个回答

122

27
因为某种奇怪的原因,在我的Windows 10系统上,这仅仅只是打开了资源管理器中的用户文档库,并将“我的文档”聚焦于其中。 - MisterGeeky
4
我遇到了和 @MisterGeeky 相同的问题,它只会打开 "我的文档"。我相当确定这与反斜杠有关... - birgersp
1
我忘记在/select和路径之间添加逗号(,),然后打开了“我的文档”。即explorer /select,“C:\path\of\folder\file”是正确的,而不是explorer /select "C:\path\of\folder\file" - Phani Rithvij
4
如果你在文件路径中使用斜杠,那么请执行filepath.replace('/', '\'),这样就像C:\path\of\folder\file一样。 - Paul Sumpner
1
注意到如果要结合 f 和 r 字符串执行此操作,可以使用 subprocess.Popen(fr'explorer /select,"{my_var}"') - Ola Karlsson
显示剩余9条评论

38

更好、更安全的解决方案(仅适用于 Windows)是使用 os.startfile()

如果给出的是一个文件夹而不是一个文件,它将打开资源管理器。

我知道我没有完全回答问题,因为它没有选择文件,但对于安全原因,使用 subprocess 总是种不好的想法,这个解决方案可能会帮助其他人。


是的,我明白不安全的概念,但我一直很安全 :) 谢谢你的提示,这也帮助了我(是的,这些年来) - Kirill Titov
2
不太跨平台,startfile 只存在于 Windows 上(https://dev59.com/HIrda4cB1Zd3GeqPHQ0U)。 - c z
1
另一个令人失望的事情是:os.startfile()不接受参数☹ 虽然在资源管理器的情况下,通过subprocess.runPopen轻松分离进程。 - ewerybody
2
该函数拒绝像 ./some/folder 这样的路径。您可以使用 os.path.abspath("./some/folder") 先转换路径。 - tsh
2
使用子进程总是一个不好的想法...什么?不,它并不是。 - Glenn Maynard
@GlennMaynard 因为例如,cmd=r'explorer /select,"C:\path\of\folder\file"'; subprocess.Popen(cmd) 如果字符串 cmd 被恶意用户攻击,它可以例如创建一个新文件(在 Windows 上的示例):'cmd /c type NUL > 1.txt'。有更多的想象力可以做很多邪恶的事情,这就是为什么我认为玩弄 subprocess 不是一个好主意。 - Guillaume Lebreton

16

由于explorer可以被覆盖,因此直接指向可执行文件会更安全。(我也需要受到教育

在此同时:请使用Python 3的当前子进程API:run()

import os
import subprocess
FILEBROWSER_PATH = os.path.join(os.getenv('WINDIR'), 'explorer.exe')

def explore(path):
    # explorer would choke on forward slashes
    path = os.path.normpath(path)

    if os.path.isdir(path):
        subprocess.run([FILEBROWSER_PATH, path])
    elif os.path.isfile(path):
        subprocess.run([FILEBROWSER_PATH, '/select,', path])

这在Windows 10上无法工作。它会打开我的电脑。 - Patt
@Patt:我刚试了r'C:\path\file.exe'C:\\path\\file.exeC:/path/file.exe,它们都可以工作。你只需要确保你的路径格式正确,并且os.path.isfile可以在其上工作。 - ewerybody
@Spencer:不,那没关系。这就是 path = os.path.normpath(path) 的作用 :) - ewerybody
@大家好,是的,我错了...我已删除了我的评论。 - Spencer

12

由于某些原因,在Windows 7上它总是打开用户路径,对我来说以下方法可行:

import subprocess
subprocess.call("explorer C:\\temp\\yourpath", shell=True)

1
subprocess.Popen(r'explorer /select,"C:\path\of\folder\file"') 可以正常工作,但是如果用户在程序的某个地方执行了这个语句后去到其他窗口,如何让这个窗口显示在其他窗口之上呢? - Nancy
这应该自动弹出在前面。 - user1767754
尽量避免使用 shell=True 选项! https://security.openstack.org/guidelines/dg_use-subprocess-securely.html - ewerybody
只要你知道你在哪里使用它,而且它是在一个封闭的环境中,那就没问题。 - user1767754

11

或者,您可以使用EasyGUI的fileopenbox模块打开文件资源管理器供用户浏览,然后选择文件(返回完整的文件路径)。

import easygui
file = easygui.fileopenbox()

8

如果你想知道如何使用变量代替直接文件路径,下面的代码将会打开资源管理器并高亮指定的文件。

import subprocess
subprocess.Popen(f'explorer /select,{variableHere}')

下面的代码将仅在资源管理器中打开指定的文件夹,而不突出显示任何特定文件。
import subprocess
subprocess.Popen(f'explorer "{variableHere}"')

我只在Windows上进行了测试。


在Python 3中,这应该是一个原始格式字符串,即subprocess.Popen(fr'explorer "{variableHere}"') - Spencer

1

打开资源管理器的代码:

import os
import ctypes
SW_SHOWDEFAULT = 10
path_to_open = os.getenv('windir')
ctypes.windll.shell32.ShellExecuteW(0, "open", path_to_open, 0, 0, SW_SHOWDEFAULT)

1
import os 
path = "C:\path\of\folder"
os.startfile(path)

使用此命令,您可以在文件资源管理器中转到路径。

0
import os
os.system('notepad filename')

例子1. 如果我在同一目录下有一个文件no.txt

os.system('notepad no.txt')

示例2。如果我想在其他目录中打开文件

os.system('notepad "C:\\Users\\DELL\\Downloads\\a.txt"')

注意:我正在Windows上运行,所以我使用记事本,您可以根据您的操作系统进行替换。

0
import subprocess
subprocess.Popen(r'explorer /open,"C:\path\of\folder\file"')

我发现使用 explorer /open 命令可以列出目录中的文件。当我使用了 /select 命令(如上所示),explorer 打开了父目录并将我的目录标记为高亮。


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