Python - Коли використовувати файл vs open


138

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

Відповіді:


153

Ви завжди повинні використовувати open().

Як зазначено в документації :

Під час відкриття файлу бажано використовувати open (), а не викликати цей конструктор безпосередньо. Файл більше підходить для тестування типів (наприклад, написання "isin substance (f, file)").

Також file() було видалено з Python 3.0.


23
Це викликає занепокоєння, оскільки документація, що використовується для створення "конструктора файлів (), є новим у Python 2.2. Попереднє написання, open (), зберігається для сумісності та є псевдонімом для файлу ()." Оскільки я вирішив RTFM десять років тому і дуже захопився об'єднанням типів і класів, я більше ніколи не використовував open (). Більше того, я все ще відчуваю, що конструктор типу є більш очевидним способом повернення файлу, подібного до об'єкта, розташованого в аргументі шляху, і вести себе так, як вимагається в режимі arg. Я особливо відчуваю це так, коли очевидний намір тодішніх розробок був 2 утримувати open4compat.
умебоші

32

Дві причини: Філософія пітона "Має бути один спосіб зробити це" і fileвідходить.

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

У python 3.0 fileперейде від вбудованого до впровадженого кількома класами в ioбібліотеці (дещо схожий на Java з буферизованими читачами тощо)


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

19

file()це тип, як int або list. open()є функцією для відкриття файлів і повертає fileоб'єкт.

Це приклад, коли слід використовувати відкритий:

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, другий приклад просто успадковується від класу файлів. Я гадаю, що це дивно, що це в нижньому регістрі, але саме так відбувається з основними вбудованими типами (наприклад, об'єкт, str, список, ...)
yoniLavi

1
У Python 2.5 fileклас був обладнаний спеціальними методами, які автоматично викликаються щоразу, коли файл відкривається через withоператор. Ці спеціальні методи забезпечують належне та безпечне відкриття та закриття файлу.
Mausy5043

7

Функціонально два однакові; openзателефонуємо fileвсе одно, тому наразі різниця - це питання стилю. Документи Python рекомендують використовувати open.

Під час відкриття файлу бажано використовувати open (), а не викликати конструктор файлів безпосередньо.

Причина полягає в тому, що в майбутніх версіях вони не гарантуються однаковими ( openстануть заводською функцією, яка повертає об'єкти різних типів залежно від шляху, який він відкриває).


2
open - це вже фабрична функція, тому є функціональні відмінності (наприклад, успадкування, isin substance () тощо)
Брайан

4

Використовуйте open () лише для відкриття файлів. Файл () фактично видаляється в 3.0, і він наразі застарілий. У них були якісь дивні стосунки, але файл () зараз триває, тому більше не потрібно хвилюватися.

Далі йдеться з документів Python 2.6. [дужка речі] додана мною.

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


2

За словами пана Ван Россума, хоча open () в даний час є псевдонімом для файлу (), ви повинні використовувати open (), оскільки це може змінитися в майбутньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.