Diferença entre os modos a, a +, w, w + e r + na função aberta integrada?

610

No python built-in aberto função, qual é a diferença exata entre os modos w, a, w+, a+, e r+?

Em particular, a documentação implica que tudo isso permitirá a gravação no arquivo e diz que ele abre os arquivos para "anexar", "escrever" e "atualizar" especificamente, mas não define o que esses termos significam.

flybywire
fonte
11
O link que você forneceu define exatamente os valores. Que parte do link que você forneceu não pôde ver ou entender? Você poderia esclarecer sua pergunta para explicar o que você não entendeu sobre o link?
S.Lott
@ChrisB. - Eu relatei isso como bug em bugs.python.org/issue19627
Bulwersator
2
não existe um documento simples e único que explique o que o sinal + significa?
Charlie Parker

Respostas:

740

Os modos de abertura são exatamente os mesmos que para a função de biblioteca padrão C fopen().

A página de fopenmanual do BSD os define da seguinte maneira:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
drAlberT
fonte
3
Eu acredito que você quer dizer a chamada fopen na biblioteca padrão C (que não é uma chamada de sistema)
Eli Courtwright
14
NOTA: O Python v3 adiciona vários modos adicionais. link para docs
Alex
5
Observou que we w+ambos podem fazerThe file is created if it does not exist
Wei Yang
4
No Windows, banexado ao modo abre o arquivo no modo binário, então há também os modos como rb, wb, e r+b. O Python no Windows faz uma distinção entre arquivos de texto e binários; os caracteres de fim de linha nos arquivos de texto são automaticamente ligeiramente alterados quando os dados são lidos ou gravados.
6
Estou certo em dizer que +não faz algo consistente e independente, se é a, wou r? Ou estou deixando de ver o padrão? Qual é o padrão?
Charlie Parker
510

Percebi que, de vez em quando, preciso abrir o Google novamente, apenas para criar uma imagem mental das principais diferenças entre os modos. Então, pensei que um diagrama seria mais rápido de ler na próxima vez. Talvez alguém ache isso útil também.

Andrzej Pronobis
fonte
3
A adescrição está errada . As gravações estão sempre posicionadas no final.
Antti Haapala
10
@ E acredito que @Antti está se referindo à propriedade Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarque é um pouco mais forte do que apenas dizer que a posição inicial é o fim.
jcai
8
@CharlieParker Que existem basicamente duas operações de arquivo (leitura, gravação). O modo r é principalmente para leitura, os modos w , a são principalmente para escrita. E o sinal de mais permite a segunda operação para um determinado modo (simplesmente dito).
Jeyekomon
22
Para a posteridade: truncar significa substituir desde o início.
Minh Tran
4
@Jeyekomon Seu resumo no seu comentário aqui é provavelmente a coisa mais útil que eu já li na tentativa de entender esses modos de uma maneira que agora me lembro! O fluxograma nesta resposta é lindo e a tabela na resposta abaixo é ótima, mas se essas respostas (e outras em outros lugares) começarem com esse ponto simples e funcionarem a partir daí, ajudaria a fornecer uma estrutura mental muito melhor para pendurar os detalhes em. Então obrigado. (Estou ciente este é talvez no limite de spam, mas eu senti o seu comentário reconhecimento merecido) 💯
Tim
206

Mesma informação, apenas em forma de tabela

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

onde os significados são: (apenas para evitar interpretações erradas)

  • read - a leitura do arquivo é permitida
  • gravação - a gravação no arquivo é permitida

  • create - o arquivo é criado se ainda não existir

  • truncado - durante a abertura do arquivo, ele é esvaziado (todo o conteúdo do arquivo é apagado)

  • posição no início - depois que o arquivo é aberto, a posição inicial é definida para o início do arquivo

  • posição no final - depois que o arquivo é aberto, a posição inicial é definida para o final do arquivo

Nota: ae a+sempre acrescente ao final do arquivo - ignora qualquer seekmovimento.
Entre. comportamento interessante pelo menos no meu win7 / python2.7, para novo arquivo aberto no a+modo:
write('aa'); seek(0, 0); read(1); write('b')- segundo writeé ignorado
write('aa'); seek(0, 0); read(2); write('b')- segundo writeaumentaIOError

industryworker3595112
fonte
10
Por que não existe "Criar arquivo se ele não existir. Se existir, posicione no início, ative a leitura e gravação"? Este é o caso de uso mais óbvio para mim: estou armazenando dados em um arquivo. Se o arquivo não estiver lá, crie-o em vez de errar. Se houver dados no arquivo, eu quero ler tudo de cima, atualize algumas coisas e reescreva completamente o arquivo de 0 para a PRÓXIMA VEZ que eu o carregar. Eu uso open(file,'a'); close(); open(file,'r+')para conseguir isso.
pinhead
2
O que significa "truncar" neste contexto?
Charlie Parker
3
@CharlieParker Isso significa que todo o conteúdo do arquivo é apagado (arquivo é feito vazia)
industryworker3595112
1
Você pode adicionar uma observação de que with aand a+write sempre acontecerá no final do arquivo, independentemente de alguém mover o ponteiro manualmente usando seek().
balu
1
Que tal atualizar a tabela para incluir 'x' para Python 3?
Nikos Alexandris
39

As opções são as mesmas da função fopen na biblioteca padrão C:

w trunca o arquivo, substituindo o que já estava lá

a anexa ao arquivo, adicionando ao que já estava lá

w+ abre para leitura e gravação, truncando o arquivo, mas também permitindo que você leia novamente o que foi gravado no arquivo

a+ abre para acrescentar e ler, permitindo que você acrescente ao arquivo e também leia seu conteúdo

Eli Courtwright
fonte
2
O que significa "truncar" neste contexto? Significa excluir os dados antigos, se houver algum? Ou algo mais específico?
Charlie Parker
3
@CharlieParker: Correto - significa que todos os dados no arquivo existente serão descartados e começamos a escrever desde o início de um arquivo agora vazio.
Eli Courtwright
9

Eu acho que isso é importante a considerar para a execução de plataforma cruzada, ou seja, como um CYA. :)

No Windows, 'b' anexado ao modo abre o arquivo no modo binário, então também existem modos como 'rb', 'wb' e 'r + b'. O Python no Windows faz uma distinção entre arquivos de texto e binários; os caracteres de fim de linha nos arquivos de texto são automaticamente ligeiramente alterados quando os dados são lidos ou gravados. Essa modificação nos bastidores dos dados dos arquivos é boa para arquivos de texto ASCII, mas corrompe dados binários como os dos arquivos JPEG ou EXE. Tenha muito cuidado ao usar o modo binário ao ler e gravar esses arquivos. No Unix, não custa anexar um 'b' ao modo, para que você possa usá-lo independentemente da plataforma para todos os arquivos binários.

Isso está diretamente citou Python Software Foundation 2.7.x .

Goran B.
fonte
9

Eu tentei descobrir isso por que você usaria o modo 'w +' versus 'w'. No final, acabei de fazer alguns testes. Não vejo muita finalidade para o modo 'w +', pois nos dois casos, o arquivo é truncado para começar. No entanto, com o 'w +', você pode ler depois de escrever, procurando de volta. Se você tentasse ler com 'w', isso geraria um IOError. Ler sem usar a busca com o modo 'w +' não renderá nada, pois o ponteiro do arquivo estará atrás de onde você escreveu.

Wyrmwood
fonte