我想知道文件open()
模式验证(Python2.7)发生了什么:
>>> with open('input.txt', 'illegal') as f:
... for line in f:
... print line
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'illegal'
>>> with open('input.txt', 'rock&roll') as f:
... for line in f:
... print line
...
1
2
3
所以,我不能在illegal
模式下打开文件,但我可以在rock&roll
模式下打开它。在这种情况下,实际用于打开文件的模式是什么?
注意,在python3上,我不能同时使用illegal
和rock&roll
:
>>> with open('input.txt', 'rock&roll') as f:
... for line in f:
... print(line)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid mode: 'rock&roll'
>>> with open('input.txt', 'illegal') as f:
... for line in f:
... print(line)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid mode: 'illegal'
这令人困惑,为什么python3.x的行为不同?
Python 2.x open
函数本质上将其工作委托给C库fopen
函数。在我的系统上,fopen
的文档包含:
参数
mode
指向一个以以下序列之一开头的字符串(这些序列后面可能会有其他字符):
您的ock&roll
被视为"附加字符"。
在Python3中,允许的打开模式受到更多限制(本质上,只允许有效的字符串)。
前面的回溯很好地解释了这一点:
ValueError:模式字符串必须以"r"、"w"、"a"或"U"之一开始
"摇滚乐"以"r"
开头,所以它显然是合法的。