Como se acrescenta a um ficheiro em Python?

Como se anexa ao ficheiro em vez de o escrever por cima? Existe alguma função especial que apareça ao ficheiro?

Solução
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Comentários (16)

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

Quando você abre com o modo "a", a posição de escrita ** sempre estará no final do arquivo (um apêndice). Você pode abrir com "a+" para permitir a leitura, procurar para trás e ler (mas todas as escritas 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 até o fim do arquivo - considere o que poderia acontecer se outro programa abrisse o arquivo e começasse a escrever entre a procura e a escrita. Em alguns sistemas operacionais, abrir o arquivo com 'a' garante que todas as suas escritas seguintes serão anexadas atomicamente ao final do arquivo (mesmo que o arquivo cresça com outras escritas).


Mais alguns detalhes sobre como o modo "a" funciona (testado apenas no Linux). Mesmo se você procurar de volta, cada escrita 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'

Na verdade, o fopen manpage afirma:

Abrindo um arquivo no modo anexo (a como primeiro caractere do modo) faz com que todas as operações de escrita subsequentes a este fluxo ocorram em fim do ficheiro, como se tivesse precedido a chamada:

fseek(stream, 0, SEEK_END);


Antiga resposta simplificada (não utilizando with):

Exemplo: (em um programa real utilizar with para fechar o arquivo - ver a documentação)

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
Comentários (3)

Você provavelmente quer passar 'a' como o argumento de modo. Veja os documentos para open().

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

Há outras permutações do argumento do modo para atualizar (+), truncating (w) e modo binário (b), mas começar com apenas "a" é a sua melhor aposta.

Comentários (2)