打开文件时出现'invalid argument'错误(而不是读取文件)
我正在尝试写一段代码,这段代码可以从一个文本文件中读取两个数字,然后将这两个数字相除,并以一个上重的分数形式显示结果。我已经成功地让程序在我手动输入值时处理分数部分,但我现在遇到的问题是程序无法识别这个文本文件。我尝试过把文件放在同一个文件夹里,也试过使用文件的完整路径,但到目前为止都没有成功。现在我只想让程序打印出文件的内容。
with open('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.4\topheavy.txt','w') as f:
for line in f:
for word in line.split():
print(word)
接下来我会把这两个值分别赋给x和y,但我遇到了这个错误:
Traceback (most recent call last):
File "C:\Python34\divider.py", line 2, in <module>
open('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.4\topheavy.txt','w')
OSError: [Errno 22] Invalid argument:'C:\\ProgramData\\Microsoft\\Windows\\Startmenu\\Programs\\Python 3.4\topheavy.txt'
9 个回答
正如Python文档上所写,IOError异常会在以下情况下发生:
当一个输入输出操作(比如打印语句、内置的open()函数或者文件对象的方法)因为与输入输出相关的原因失败时,就会引发这个异常。例如,可能会出现“找不到文件”或者“磁盘已满”的情况。
我在使用Python 3.5.4读取一个大文件时也遇到了同样的错误。为了解决这个问题,我没有一次性把整个文件都读到内存里,而是选择一行一行地读取:
with open('big.txt') as f:
for i in f:
print(i)
你正在使用反斜杠“\”作为分隔符,这可能在某个地方被转义了(比如在结尾附近的那个\t)。反斜杠是Windows系统的路径分隔符,但它也用作字符串的转义符。
你可以把反斜杠写成两个“\\”。不过最简单的方法是在前面加一个“r”,这样就可以忽略转义的问题。
r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.4\topheavy.txt"
别听那些建议你用斜杠“/”的说法,因为你不是在Unix系统上,Python完全可以支持Windows,只要你记得反斜杠也会被当作转义符。用“r”开头的字符串还可以让你方便地从字符串中复制粘贴到其他程序,或者反过来。
另外,最好在c:\temp这样的路径下测试一下,以避免因为路径输入错误而出现的问题。
最后但同样重要的是,你需要以“r”模式打开文件,正如之前提到的那样。
open('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.4\topheavy.txt','w') OSError: [Errno 22] Invalid argument:'C:\\ProgramData\\Microsoft\\Windows\\Startmenu\\Programs\\Python 3.4\topheavy.txt'
有两件事情需要注意:
- 当你处理包含反斜杠的路径时,你需要使用两个反斜杠,或者使用
r''
的形式来避免解释转义字符。比如,你可以写成'C:\\Program Files\\...'
或者r'C:\Program Files\...'
。 - 你的错误信息显示的是
\\Startmenu\\
。看起来在“Start”和“menu”之间缺少一个空格,尽管打开的那行似乎路径是正确的。
注意:你路径中的 \topheavy.txt
可能也被转换成了 <tab>opheavy.txt
。这就是为什么在错误追踪中它前面没有两个反斜杠的原因。