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.
Respostas:
Os modos de abertura são exatamente os mesmos que para a função de biblioteca padrão C
fopen()
.A página de
fopen
manual do BSD os define da seguinte maneira:fonte
w
ew+
ambos podem fazerThe file is created if it does not exist
b
anexado ao modo abre o arquivo no modo binário, então há também os modos comorb
,wb
, er+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.+
não faz algo consistente e independente, se éa
,w
our
? Ou estou deixando de ver o padrão? Qual é o padrão?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.
fonte
a
descrição está errada . As gravações estão sempre posicionadas no final.Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar
que é um pouco mais forte do que apenas dizer que a posição inicial é o fim.Mesma informação, apenas em forma de tabela
onde os significados são: (apenas para evitar interpretações erradas)
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
Nota:
a
ea+
sempre acrescente ao final do arquivo - ignora qualquerseek
movimento.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')
- segundowrite
é ignoradowrite('aa'); seek(0, 0); read(2); write('b')
- segundowrite
aumentaIOError
fonte
open(file,'a'); close(); open(file,'r+')
para conseguir isso.a
anda+
write sempre acontecerá no final do arquivo, independentemente de alguém mover o ponteiro manualmente usandoseek()
.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 arquivoa+
abre para acrescentar e ler, permitindo que você acrescente ao arquivo e também leia seu conteúdofonte
Eu acho que isso é importante a considerar para a execução de plataforma cruzada, ou seja, como um CYA. :)
Isso está diretamente citou Python Software Foundation 2.7.x .
fonte
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.
fonte