Confuso com o modo de arquivo python "w +"


201

No documento ,

Os modos 'r +', 'w +' e 'a +' abrem o arquivo para atualização (observe que 'w +' trunca o arquivo). Anexe 'b' ao modo para abrir o arquivo no modo binário, em sistemas que diferenciam arquivos binários e de texto; em sistemas que não têm essa distinção, adicionar o 'b' não tem efeito.

e aqui

w +: abre um arquivo para escrita e leitura. Substitui o arquivo existente, se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

Mas, como ler um arquivo aberto w+?


27
Achei esse diagrama bastante útil.
Ritwik

Respostas:


132

Digamos que você esteja abrindo o arquivo com uma withdeclaração como deveria. Então você faria algo assim para ler o seu arquivo:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Observe o f.seek(0)- se você esquecer isso, a f.read()chamada tentará ler a partir do final do arquivo e retornará uma string vazia.


1
o que significa "truncando para 0 bytes"?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi - Os documentos do Python dizem que w+"substituirá o arquivo existente se o arquivo existir". Então, assim que você abre um arquivo w+, ele agora é um arquivo vazio: contém 0 bytes. Se ele costumava conter dados, esses dados foram truncados - cortados e descartados - e agora o tamanho do arquivo é 0 bytes, portanto, você não pode ler nenhum dado existente antes de abrir o arquivo w+. Se você realmente queria ler os dados anteriores e adicioná-los, deve usar em r+vez de w+.
Rmunn

como adicionar novos dados no topo?
Beqa Bukhradze

1
@BeqaBukhradze - Se você tiver uma pergunta, clique no botão "Fazer uma pergunta", onde será vista por centenas de pessoas. Não basta clicar no botão "Adicionar comentário", onde apenas uma ou duas pessoas o verão.
Rmunn

430

Aqui está uma lista dos diferentes modos de abrir um arquivo:

  • r

    Abre um arquivo apenas para leitura. O ponteiro do arquivo é colocado no início do arquivo. Este é o modo padrão.

  • rb

    Abre um arquivo para leitura apenas em formato binário. O ponteiro do arquivo é colocado no início do arquivo. Este é o modo padrão.

  • r +

    Abre um arquivo para leitura e gravação. O ponteiro do arquivo estará no início do arquivo.

  • rb +

    Abre um arquivo para leitura e gravação em formato binário. O ponteiro do arquivo estará no início do arquivo.

  • W

    Abre um arquivo apenas para gravação. Substitui o arquivo se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para gravação.

  • wb

    Abre um arquivo para gravação apenas em formato binário. Substitui o arquivo se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para gravação.

  • w +

    Abre um arquivo para escrever e ler. Substitui o arquivo existente, se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

  • wb +

    Abre um arquivo para escrever e ler em formato binário. Substitui o arquivo existente, se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

  • uma

    Abre um arquivo para anexar. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. Ou seja, o arquivo está no modo de acréscimo. Se o arquivo não existir, ele criará um novo arquivo para gravação.

  • ab

    Abre um arquivo para anexar em formato binário. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. Ou seja, o arquivo está no modo de acréscimo. Se o arquivo não existir, ele criará um novo arquivo para gravação.

  • a +

    Abre um arquivo para anexar e ler. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. O arquivo é aberto no modo de acréscimo. Se o arquivo não existir, ele criará um novo arquivo para leitura e gravação.

  • ab +

    Abre um arquivo para anexar e ler em formato binário. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. O arquivo é aberto no modo de acréscimo. Se o arquivo não existir, ele criará um novo arquivo para leitura e gravação.


portanto, para todos os fins intensivos, r + ew + são iguais?
21714 Nick Humrich

21
@ Humdinger: Não, w+cria um novo arquivo ou trunca um arquivo existente e o abre para leitura e gravação; r+abre um arquivo existente sem truncá-lo para leitura e gravação. Muito diferente.
abarnert

Além disso, como na resposta de @ AlokAgarwal, isso afirma ser uma lista exaustiva de modos, mas não é.
abarnert

1
Seria um pouco tolo fornecer uma lista exaustiva de modos, pois eles funcionam mais como uma função com vários parâmetros. r,, wou asão exclusivos, mas bpodem ser adicionados a qualquer um deles, como é possível +ou U... É uma explosão combinatória.
Rmunn

4
rbnão é o modo padrão, a citar: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
Iggy

158

Todos os modos de arquivo em Python

  • r para ler
  • r+ abre para leitura e gravação (não é possível truncar um arquivo)
  • w para escrever
  • w+ para escrever e ler (pode truncar um arquivo)
  • rbpara ler um arquivo binário. O ponteiro do arquivo é colocado no início do arquivo.
  • rb+ lendo ou gravando um arquivo binário
  • wb+ escrevendo um arquivo binário
  • a+ abre para anexar
  • ab+Abre um arquivo para anexar e ler em binário. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. O arquivo é aberto no modo de acréscimo.
  • x aberto para criação exclusiva, falhando se o arquivo já existir (Python 3)

5
Este não é todos os modos. Negligencia, por exemplo, rbe wb, sem mencionar os Umodos em 2.xe o tmodo em 3.x (que podem ser combinados com tudo, exceto b).
Abarnert 4/08/14

1
A diferença entre r + ew + é que w + trunca um arquivo quando ele é aberto. Mas você pode truncá-lo manualmente nos dois modos.
Martin

1
Esta resposta é inconstante com a dada por @ 200 OK, por exemplo, wb+também lê o arquivo?
Celeritas 17/07/2015

@Celeritas O wb indica que o arquivo está aberto para gravação no modo binário. Nos sistemas Unix (Linux, Mac OS X, etc.), o modo binário não faz nada - eles tratam os arquivos de texto da mesma maneira que qualquer outro arquivo. No Windows, no entanto, os arquivos de texto são gravados com finais de linha levemente modificados. Isso causa um problema sério ao lidar com arquivos binários reais, como arquivos exe ou jpg. Portanto, ao abrir arquivos que não deveriam ser texto, mesmo no Unix, você deve usar wb ou rb. Use w ou r comum apenas para arquivos de texto.
Alok Agarwal

No Python 3, também existe o modo de abertura 'x': aberto para criação exclusiva, falhando se o arquivo já existir. Veja a função aberta no doc.
Laurent LAPORTE

9

r para ler

w para escrever

r+ para leitura / gravação sem excluir o conteúdo original, se o arquivo existir, caso contrário, crie uma exceção

w+ para excluir o conteúdo original, leia / grave se o arquivo existir; caso contrário, crie o arquivo

Por exemplo,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

O arquivo está truncado, então você pode chamar read()(sem exceções, ao contrário de quando aberto usando 'w'), mas você obterá uma string vazia.


2

Eu suspeito que existem duas maneiras de lidar com o que acho que você está tentando alcançar.

1) o que é óbvio, é abrir o arquivo apenas para leitura, ler na memória, abrir o arquivo com t e escrever suas alterações.

2) use as rotinas de manipulação de arquivos de baixo nível:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Espero que isto ajude..


Então, para quê r+
SmartManoj

1

Na verdade, há algo errado em todas as outras respostas sobre o r+modo.

test.in conteúdo do arquivo:

hello1
ok2
byebye3

E o script py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Execute-o e o test.inconteúdo do será alterado para:

hello1
ok2
byebye3
addition

No entanto, quando modificamos o script para:

with open("test.in", 'r+')as f:
    f.write("addition")

o test.intambém responde:

additionk2
byebye3

Portanto, o r+modo nos permitirá cobrir o conteúdo desde o início, se não fizermos a operação de leitura. E se fizermos alguma operação de leitura,f.write() basta anexar ao arquivo.

By the way, se f.seek(0,0)antes f.write(write_content), o write_content vai cobri-los a partir do positon (0,0).


0

Conforme mencionado pelo h4z3 , para uso prático, às vezes seus dados são grandes demais para carregar tudo diretamente, ou você tem um gerador ou dados recebidos em tempo real, você pode usar o w + para armazenar em um arquivo e ler mais tarde.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.