Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python在默认程序中打开文件_Python_Windows_File_Python 3.x_Text - Fatal编程技术网

如何使用python在默认程序中打开文件

如何使用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

我想在Python3.5的默认应用程序中打开一个文件,特别是记事本中的“screen.txt”

我在互联网上搜索过,在大多数答案上都找到了
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')

  • 您可以使用“原始字符串文字”。在开头的单引号或双引号前加一个
    r
    。这将使反斜杠不会得到特别的解释<代码>os.startfile(r'C:\foo\bar\baz')


最后一个可能是最好的,除了一个恼人的怪癖:反斜杠引号在原始字符串文字中仍然很特殊,因此您仍然可以说
“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)