如何使用python在默认程序中打开文件
我想在Python3.5的默认应用程序中打开一个文件,特别是记事本中的“screen.txt” 我在互联网上搜索过,在大多数答案上都找到了如何使用python在默认程序中打开文件,python,windows,file,python-3.x,text,Python,Windows,File,Python 3.x,Text,我想在Python3.5的默认应用程序中打开一个文件,特别是记事本中的“screen.txt” 我在互联网上搜索过,在大多数答案上都找到了os.startfile(path)。我用文件的路径os.startfile(C:\[directories n stuff]\screen.txt)尝试了这一点,但它返回了一个错误,称为“行续字符后的意外字符”。我在没有文件路径的情况下尝试了它,只有文件名,但它仍然不起作用 这个错误意味着什么?我以前从未见过它 请提供打开.txt文件的解决方案 编辑:我在W
os.startfile(path)
。我用文件的路径os.startfile(C:\[directories n stuff]\screen.txt)
尝试了这一点,但它返回了一个错误,称为“行续字符后的意外字符”。我在没有文件路径的情况下尝试了它,只有文件名,但它仍然不起作用
这个错误意味着什么?我以前从未见过它
请提供打开.txt文件的解决方案
编辑:我在Windows 7上的一台受限制(学校)计算机上。例如,我在驱动器D上创建了文件
“test file.txt”
,因此文件路径是'D:/test file.txt'
现在,我可以使用与该脚本关联的程序打开它:
import os
os.startfile('d:/test file.txt')
从你现在的问题很难确定,但我打赌你的问题是反斜杠 [编辑添加:]或者实际上可能是更简单的东西。你在路径名周围加了引号吗?如果没有,那肯定行不通——但一旦你做到了,你会发现你需要我在下面写的其余内容 在Windows文件系统中,反斜杠
\
是分隔目录的标准方法
在Python字符串文字中,反斜杠\
用于将难以输入的内容放入字符串中。例如,如果您正在编写一个带引号的字符串,并且希望在其中包含一个引号,则可以这样做:“不要”
。或者,如果需要换行符,可以这样做:“第一行。\n第二行”。
因此,如果您采用Windows路径名并将其插入Python,如下所示:
os.startfile('C:\foo\bar\baz')
然后实际传递到os.startfile
的字符串将不包含这些反斜杠;它将包含一个换页字符(来自\f
)和两个退格字符(来自\b
s),这根本不是您想要的
你可以用三种方法来处理这个问题
- 可以使用正斜杠而不是反斜杠。尽管Windows在其用户界面中更喜欢反斜杠,但正斜杠也可以工作,并且在Python字符串文本中它们没有特殊意义
- 您可以“避开”反斜杠:一行中的两个反斜杠表示实际的反斜杠
os.startfile('C:\\foo\\bar\\baz')
- 您可以使用“原始字符串文字”。在开头的单引号或双引号前加一个
。这将使反斜杠不会得到特别的解释<代码>os.startfile(r'C:\foo\bar\baz')r
最后一个可能是最好的,除了一个恼人的怪癖:反斜杠引号在原始字符串文字中仍然很特殊,因此您仍然可以说
“don't”
,这意味着您不能用反斜杠结束原始字符串文字。使用默认程序打开文件的推荐方法是os.startfile
。您可以使用os.system
或子流程执行更为手动的操作,不过:
os.system(r'start ' + path_to_file')
或
当然,这不会跨平台工作,但对于您的用例来说可能已经足够了。您是否编写了os.startfile(C:\foo\bar\screen.txt)
或类似的os.startfile('C:\foo\bar\screen.txt')
,并在字符串周围加上引号?@GarethMcCaughan能否将os.startfile('C:\foo\bar\screen.txt')更改为os.startfile('C:\\foo\\bar\\screen.txt')如果你的意思是我可以在这里的问题中更改它:不可以,因为我打赌如果Adam在引号中加上引号,他就不会在转义中加上引号。(见下面我的答案。)我没有加引号或转义反斜杠。Hmmmmm。谢谢:))注意,Windows在其本机对象命名空间中只使用反斜杠作为路径分隔符(这是在内部实现的,未记录,例如驱动器号和UNC路径基于对象符号链接)。在创建本机路径的NTDLL API中,正斜杠被转换为反斜杠。但是,有几种情况需要反斜杠:命名全局内核对象(例如,global\…
);注册表路径,转换为\registry\MACHINE\…
或\registry\USER\…
;以及使用\?\
前缀超过最大路径的文件系统路径(260)字符。是的,这是一个很好的观点。还有访问设备时有时需要的“\\”。本地设备前缀\\.
与斜杠配合使用(例如os.listdir('//./pipe')
).Windows将其转换为DOS设备目录\?
。\?
前缀也映射到\?
,大多数API接受它而不是\。
。DOS设备目录是虚拟的。对象管理器首先检查用户的登录会话目录\Sessions\0\DosDevices\[登录ID]
,然后检查全局DOS设备目录\global???
。这些目录具有指向通常位于\Device
中的设备的符号链接,例如C:
=>\Device\HarddiskVolume1
。我从来不知道你可以使用/./
而不是\.
。谢谢!我个人更喜欢使用原始文件Windows上的字符串:os.startfile(r'C:\foo\bar\baz')
。请注意字符串开头的r
。您忘记了子流程示例的shell=True
,在这种情况下,您应该始终使用命令行字符串。start
是cmd.exe的内部命令。没有start.exe。感谢您提供的提示!您仍在使用列表。subprocess.list2cmdline
doesn不知道如何为cmd.exe构建命令行字符串。通常可能没有人知道如何这样做。我认为它需要一个超出人类理解的人工智能。我们可以通过诱使Skynet运行cmd.exe.Whoops.My bad来阻止它。我再次修复了它。shell=True
是这样实现的:comspec=os.environ.get(“comspec”,“cmd。
subprocess.Popen('{start} {path}'.format(
start='start', path=path_to_file), shell=True)