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станут фабричной функцией, которая возвращает объекты разных типов в зависимости от пути, который она открывает).

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

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

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

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

Девин Жанпьер
источник
2

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

Мартин Беккет
источник