Python - когда использовать файл или открыть


139

В чем разница между fileи openв Python? Когда я должен использовать какой? (Скажем, я в 2,5)

Ответы:


153

Вы всегда должны использовать open().

Как указано в документации :

При открытии файла предпочтительно использовать open () вместо прямого вызова этого конструктора. file больше подходит для тестирования типов (например, написание "isinstance (f, file)").

Кроме того, file() он был удален с Python 3.0.


23
Это вызывает беспокойство, поскольку в документации говорится: «Конструктор file () является новым в Python 2.2. Предыдущее написание, open (), сохранено для совместимости и является псевдонимом для file ()». Поскольку я решил использовать RTFM десять лет назад и очень полюбил унификацию типов и классов, я больше никогда не использовал open (). Более того, я по-прежнему считаю, что конструктор типа - более очевидный способ вернуть объект, подобный файлу, расположенный по пути arg и ведущий себя в соответствии с запросом в режиме arg. Я особенно чувствую это, когда очевидным намерением разработчиков тогда было 2 сохранить open4compat.
umeboshi

32

Две причины: Философия Python «Должен быть один способ сделать это» и fileуходит.

fileявляется фактическим типом (использование, например file('myfile.txt'), вызывает его конструктор). open- это заводская функция, которая возвращает файловый объект.

В python 3.0 fileсобирается перейти от встроенного к реализации несколькими классами в ioбиблиотеке (что-то вроде Java с буферизованными считывателями и т. Д.)


3
Две причины для чего?
Мэтт

19

file()- это тип, например int или список. open()- это функция для открытия файлов, которая возвращает fileобъект.

Это пример того, когда вам следует использовать open:

f = open(filename, 'r')
for line in f:
    process(line)
f.close()

Это пример того, когда вам следует использовать файл:

class LoggingFile(file):
    def write(self, data):
        sys.stderr.write("Wrote %d bytes\n" % len(data))
        super(LoggingFile, self).write(data)

Как видите, есть веская причина для того, чтобы существовать и то и другое, и ясный вариант использования для обоих.


5
Как правило, файлы следует открывать с withзаявлением. with open(filename, 'r') as f: \ for line in f: \ process(line). Это позволяет избежать явного закрытия. Python 2.6 и выше изначально поддерживают этот withоператор. В Python 2.5 вы должны добавить from __future__ import with_statementв начало кода.
IceArdor

Разве вы не переопределили встроенное имя во втором примере?
planetp

1
@planetp, второй пример просто наследуется от класса файла. Я полагаю, это странно, что это строчные буквы, но так обстоит дело с основными встроенными типами (например, object, str, list, ...)
yoniLavi

1
В Python 2.5 fileкласс был оснащен специальными методами, которые автоматически вызываются всякий раз, когда файл открывается с помощью withоператора. Эти специальные методы обеспечивают правильное и безопасное открытие и закрытие файла.
Mausy5043

7

Функционально они идентичны; openвсе fileравно будет звонить , поэтому в настоящее время разница заключается в стиле. Документы Python рекомендуют использовать open.

При открытии файла предпочтительнее использовать open () вместо прямого вызова конструктора файла.

Причина в том, что в будущих версиях они не обязательно будут одинаковыми ( openстанут фабричной функцией, которая возвращает объекты разных типов в зависимости от пути, который она открывает).


2
open - это уже заводская функция, поэтому есть функциональные различия (например, наследование, isinstance () и т. д.)
Брайан,

4

Всегда используйте open () только для открытия файлов. file () фактически удаляется в версии 3.0, и в настоящее время он устарел. У них были какие-то странные отношения, но file () сейчас работает, так что больше не о чем беспокоиться.

Следующее - из документации Python 2.6. [скобки] добавлены мной.

При открытии файла предпочтительно использовать open () вместо прямого вызова этого конструктора [file ()]. file больше подходит для тестирования типов (например, запись isinstance (f, file)


2

По словам г-на Ван Россума, хотя open () в настоящее время является псевдонимом для file (), вы должны использовать open (), потому что это может измениться в будущем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.