Python - Quando usar o arquivo vs aberto

138

Qual é a diferença entre filee openno Python? Quando devo usar qual? (Diga que estou no 2.5)

Greg
fonte

Respostas:

153

Você sempre deve usar open().

Como a documentação declara:

Ao abrir um arquivo, é preferível usar open () em vez de chamar esse construtor diretamente. O arquivo é mais adequado para o teste de tipo (por exemplo, escrevendo "isinstance (f, file)").

Além disso, file() foi removido desde o Python 3.0.

nosklo
fonte
23
Isso é angustiante, pois a documentação usada para declarar "O construtor file () é novo no Python 2.2. A ortografia anterior, open (), é mantida para compatibilidade e é um alias para file ()." Desde que decidi usar o RTFM há dez anos e fiquei muito interessado na unificação de tipos e classes, nunca mais usei o open (). Além disso, ainda sinto que o construtor de tipos é a maneira mais óbvia de retornar um arquivo como objeto, localizado pelo caminho arg, e se comportando conforme solicitado no modo arg. Eu me sinto especialmente assim quando a intenção óbvia dos desenvolvedores naquela época era manter o open4compat.
umeboshi
32

Duas razões: a filosofia python de "Deveria haver uma maneira de fazer isso" e fileestá desaparecendo.

fileé o tipo real (usando, por exemplo, file('myfile.txt')está chamando seu construtor). opené uma função de fábrica que retornará um objeto de arquivo.

No python 3.0, deixará filede ser incorporado para ser implementado por várias classes na iobiblioteca (um pouco semelhante ao Java com leitores em buffer, etc.)

Ryan
fonte
3
Duas razões para quê?
Matt
19

file()é um tipo, como um int ou uma lista. open()é uma função para abrir arquivos e retornará um fileobjeto.

Este é um exemplo de quando você deve usar o open:

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

Este é um exemplo de quando você deve usar o arquivo:

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

Como você pode ver, há uma boa razão para ambas existirem e um caso de uso claro para ambas.

Jerub
fonte
5
Geralmente, os arquivos devem ser abertos com a withinstrução with open(filename, 'r') as f: \ for line in f: \ process(line). Isso evita o fechamento explícito. O Python 2.6 e superior suportam nativamente a withdeclaração. No Python 2.5, você deve adicionar from __future__ import with_statementao topo do seu código.
21314 IceArdor
Você não redefiniu o nome interno no segundo exemplo?
planetp
1
@ planetp, o segundo exemplo apenas herda da classe de arquivo. Suponho que é estranho que ele está em minúsculas, mas é assim que é com os tipos básicos embutidas (por exemplo, objeto, str, lista, ...)
yoniLavi
1
No Python 2.5, a fileclasse era equipada com métodos especiais que são chamados automaticamente sempre que um arquivo é aberto por meio de uma withinstrução. Esses métodos especiais garantem que o arquivo seja aberto e fechado de maneira adequada e segura.
Mausy5043
7

Funcionalmente, os dois são iguais; openvai ligar de filequalquer maneira, então atualmente a diferença é uma questão de estilo. Os documentos do Python recomendam o uso open.

Ao abrir um arquivo, é preferível usar open () em vez de chamar o construtor de arquivos diretamente.

O motivo é que, nas versões futuras, não é garantido o mesmo ( opense tornará uma função de fábrica, que retorna objetos de tipos diferentes, dependendo do caminho que está abrindo).

dF.
fonte
2
aberto já é uma função de fábrica, de forma que há diferenças funcionais (por exemplo, hereditariedade, isinstance (), etc.)
Brian
4

Sempre use open () para abrir arquivos. file () está sendo removido no 3.0 e está obsoleto no momento. Eles tiveram um tipo de relacionamento estranho, mas file () está indo agora, então não há mais necessidade de se preocupar.

O seguinte é dos documentos do Python 2.6. [material de suporte] adicionado por mim.

Ao abrir um arquivo, é preferível usar open () em vez de invocar esse construtor [file ()] diretamente. O arquivo é mais adequado para o teste de tipo (por exemplo, escrever isinstance (f, arquivo)

Devin Jeanpierre
fonte
2

Segundo Van Rossum, embora open () seja atualmente um alias para file (), você deve usar open () porque isso pode mudar no futuro.

Martin Beckett
fonte