Открыть файлы в режиме "рок-н-ролл"
Мне интересно, что происходит с проверкой режима файла 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?
Ответы
Ответ 1
Функция Python 2.x open
по существу делегирует свою работу функции C library fopen
. В моей системе документация для fopen
содержит:
Аргумент mode
указывает на строку, начинающуюся с одной из следующих последовательностей (дополнительные символы могут следовать за этими последовательностями.):
Ваш ock&roll
считается "дополнительными символами".
В Python 3 разрешенные открытые режимы более ограничены (по существу, допустимы только допустимые строки).
Ответ 2
Предыдущая трассировка объясняет это красиво:
"Строка ValueError: mode должна начинаться с одной из 'r', 'w', 'a' или 'U'"
"rock & roll" начинается с "r"
, поэтому он, по-видимому, легален.