Como você anexa a um arquivo em Python?

1574

Como você anexa ao arquivo em vez de substituí-lo? Existe uma função especial anexada ao arquivo?

Petter
fonte

Respostas:

2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Petter
fonte
10
Isso do tutorial também pode ser útil.
Dan
28
Notei que muitas pessoas estão usando o with open(file, "a")método. Talvez eu seja antiquado, mas qual é a vantagem sobre #open(file, "a") ... file.close()
75
bluewoodtree: Os benefícios são semelhantes aos do RAII em C ++. Se você esquecer close (), pode demorar um pouco até que o arquivo seja realmente fechado. É mais fácil pensar em esquecê-lo quando o código tiver vários pontos de saída, exceções e assim por diante.
Petter
54
print("appended text", file=myfile)também é possível, para uma API mais familiar.
Thomas Ahle
206

Você precisa abrir o arquivo no modo de acréscimo, definindo "a" ou "ab" como o modo. Veja open () .

Quando você abre no modo "a", a posição de gravação estará sempre no final do arquivo (um anexo). Você pode abrir com "a +" para permitir a leitura, procurar para trás e ler (mas todas as gravações ainda estarão no final do arquivo!).

Exemplo:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Nota : Usar 'a' não é o mesmo que abrir com 'w' e procurar o final do arquivo - considere o que pode acontecer se outro programa abrir o arquivo e começar a gravar entre a busca e a gravação. Em alguns sistemas operacionais, abrir o arquivo com 'a' garante que todas as suas gravações a seguir serão anexadas atomicamente ao final do arquivo (mesmo que o arquivo cresça com outras gravações).


Mais alguns detalhes sobre como o modo "a" opera ( testado apenas no Linux ). Mesmo se você procurar novamente, toda gravação será anexada ao final do arquivo:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

De fato, a página de fopen manual declara:

A abertura de um arquivo no modo de acréscimo (a como o primeiro caractere do modo) faz com que todas as operações de gravação subseqüentes nesse fluxo ocorram no final do arquivo, como se preceda a chamada:

fseek(stream, 0, SEEK_END);

Resposta simplificada antiga (sem uso with):

Exemplo: ( em um programa real, use withpara fechar o arquivo - consulte a documentação )

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
sinelaw
fonte
49

Eu sempre faço isso,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

É simples, mas muito útil.

Seth Connell
fonte
12
é um pouco mais agradável e um pouco mais seguro de escrever: com open ('filename', 'a') como f: f.write ('stuff')
Sam Redway
35

Você provavelmente deseja passar "a"como argumento de modo. Veja os documentos para open () .

with open("foo", "a") as f:
    f.write("cool beans...")

Existem outras permutações do argumento mode para atualização (+), truncamento (w) e binário (b), mas começar com just "a"é a sua melhor aposta.

istruble
fonte
20
filesombreia uma função interna. Não use para variáveis.
precisa saber é o seguinte
11
@ MarkTolonen: filenão é mais um componente do Python 3. Mesmo no Python 2, é usado muito raramente . Abrir um arquivo é uma operação comum. Não há problema em usar o filenome aqui no Python 2 e 3. Saiba quando ser inconsistente.
JFS
34

O Python tem muitas variações dos três modos principais, esses três modos são:

'w'   write text
'r'   read text
'a'   append text

Portanto, para anexar a um arquivo, é tão fácil quanto:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Depois, existem os modos que apenas tornam seu código menos linhas:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Finalmente, existem os modos de leitura / gravação em formato binário:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary
Cleve Green
fonte
14

quando usamos esta linha open(filename, "a"), que aindica o acréscimo do arquivo, isso significa permitir a inserção de dados extras no arquivo existente.

Você pode apenas usar as seguintes linhas para acrescentar o texto no seu arquivo

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")
K.Suthagar
fonte
9

Você também pode fazer isso em printvez de write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Se test.txt não existir, ele será criado ...

Alaa M.
fonte
6

Você também pode abrir o arquivo no r+modo e, em seguida, definir a posição do arquivo no final do arquivo.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Abrindo o arquivo em r+modo vai deixar você escrever para outras posições de arquivo, além do fim, enquanto ae a+força de escrita até o fim.

Primusa
fonte
4

se você deseja anexar a um arquivo

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Declaramos a variável myfilepara abrir um arquivo chamado test.txt. Open recebe 2 argumentos, o arquivo que queremos abrir e uma string que representa os tipos de permissão ou operação que queremos fazer no arquivo

aqui estão as opções do modo de arquivo

Descrição do modo

'r' Este é o modo padrão. Abre arquivo para leitura.
'w' Este modo Abre o arquivo para gravação. 
Se o arquivo não existir, ele criará um novo arquivo.
Se o arquivo existir, ele truncará o arquivo.
'x' Cria um novo arquivo. Se o arquivo já existir, a operação falhará.
'a' Abrir arquivo no modo de acréscimo. 
Se o arquivo não existir, ele criará um novo arquivo.
't' Este é o modo padrão. Abre no modo de texto.
'b' Isso abre no modo binário.
'+' Isso abrirá um arquivo para leitura e gravação (atualização)
nima moradi
fonte
4

O 'a'parâmetro significa modo de acréscimo. Se você não quiser usar with opencada vez, poderá escrever facilmente uma função para fazer isso por você:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Se você quiser escrever em outro lugar que não seja o final, use 'r+' :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Finalmente, o 'w+'parâmetro concede ainda mais liberdade. Especificamente, ele permite que você crie o arquivo se ele não existir, além de esvaziar o conteúdo de um arquivo que existe atualmente.


† O crédito para esta função vai para @Primusa

Alec Alameddine
fonte
2

A maneira mais simples de acrescentar mais texto ao final de um arquivo seria usar:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

O a+na open(...)instrução instrui a abrir o arquivo no modo de acréscimo e permite acesso de leitura e gravação.

Também é sempre uma boa prática usar file.close()para fechar todos os arquivos que você abriu quando terminar de usá-los.

mattc-7
fonte
1
"file.close" é chamado automaticamente no final do bloco "with", que é a vantagem da palavra-chave. Além disso, o OP perguntou sobre a abertura de um arquivo para anexar. O modo "+" não é necessário, a menos que você queira ler também.
Erik Knowles
-6

Aqui está o meu script, que basicamente conta o número de linhas, depois as anexa e as conta novamente para que você tenha provas de que funcionou.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
travelbones
fonte