Como apagar o conteúdo do arquivo de texto em Python?

140

Eu tenho um arquivo de texto que eu quero apagar em Python. Como faço isso?

caipira
fonte
pessoas que deram as respostas disseram que não é possível .. então você quer me dizer como fazê-lo facilmente em python?
Hick

Respostas:

279

Em python:

open('file.txt', 'w').close()

Ou, como alternativa, se você já possui um arquivo aberto:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

Em C ++, você poderia usar algo semelhante.

ondra
fonte
#include<fstream>e depois std::ofstream("file.txt");tão curto quanto em Python. :)
wilhelmtell
8
a razão pela qual isso funciona (tanto em C ++ quanto em python) é porque, por padrão, quando você abre um arquivo para gravação, ele trunca o conteúdo existente. Então, na verdade, é meio que um efeito colateral e, portanto, eu preferiria a chamada explícita para truncate () por motivos de clareza, mesmo que seja desnecessário.
Rmeador
7
se você abriu o arquivo usando "r +", use truncate (0) se tiver analisado o arquivo, o que provavelmente possui. Adicione isso à resposta acima para completá-la!
precisa saber é o seguinte
3
uso f.seek (0) para mover o ponteiro para o início do arquivo
Johan Engblom
Eu estava lendo e escrevendo para o arquivo. A resposta trunca perfeitamente o arquivo, mas cuidado se você quiser escrever algo nele novamente, não se esqueça de adicionar f.seek(0)depois f.truncate(0); caso contrário, você terá \ x00 estranhos anexados no início do arquivo.
krishna chaitanya
29

Não é uma resposta completa, mas uma extensão da resposta de ondra

Ao usar truncate()(meu método preferido), verifique se o cursor está na posição desejada. Quando um novo arquivo é aberto para leitura - open('FILE_NAME','r')o cursor está em 0 por padrão. Porém, se você analisou o arquivo no seu código, aponte para o início do arquivo novamente. truncate(0) Por padrão, truncate()trunca o conteúdo de um arquivo começando na posição atual do cusror.

Um exemplo simples

Snigdha Batra
fonte
21

A abertura de um arquivo no modo "gravação" o limpa, você não precisa especificamente gravar nele:

open("filename", "w").close()

(você deve fechá-lo, pois o momento em que o arquivo é fechado automaticamente pode ser específico da implementação)

Douglas Leeder
fonte
10

Do usuário @jamylak, uma forma alternativa open("filename","w").close()é

with open('filename.txt','w'): pass
CasualCoder3
fonte
8

Ao usar with open("myfile.txt", "r+") as my_file:, recebo zeros estranhos myfile.txt, principalmente porque estou lendo o arquivo primeiro. Para que funcionasse, tive que mudar primeiro o ponteiro my_filepara o início do arquivo com my_file.seek(0). Então eu poderia fazer my_file.truncate()para limpar o arquivo.

wcyn
fonte
1
Isso não deve surpreender, foi mencionado nesta resposta três anos antes.
AMC
6

Você precisa substituir o arquivo. Em C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Alex Korban
fonte
1
Não há necessidade de close()ligação. O destruidor fechará o arquivo. Então você só precisa criar um temporária:ofstream("test.txt");
wilhelmtell
Esta pergunta mudou desde esta resposta. Talvez excluir a pergunta, dada a nova direção da pergunta?
Seanny123
1

Atribuir o ponteiro do arquivo a nulo dentro do seu programa irá se livrar dessa referência ao arquivo. O arquivo ainda está lá. Eu acho que a remove()função no c stdio.hé o que você está procurando lá. Não tenho certeza sobre Python.

bsberry
fonte
2
BTW, remove () e unlink () diminuirão a contagem de referência em um arquivo regular, na verdade não o apagará. O arquivo será apagado quando a contagem de referência cair para zero. Por exemplo, se o seu processo tiver o arquivo aberto e você ligar para desvincular () ou remover (), ele não será excluído até que o arquivo seja fechado () d (ou seja, a contagem de referências cai para zero - também não assume outros processos tenha o arquivo aberto). Esse comportamento é útil, por exemplo, para garantir que arquivos temporários não sejam deixados por aí após o término anormal do processo (por exemplo, abrir (), desvincular (), executar E / S de arquivo, CRASH , fechar () NÃO chamado).
Vazio
1

Se a segurança é importante para você, abrir o arquivo para gravá-lo e fechá-lo novamente não será suficiente. Pelo menos algumas das informações ainda estarão no dispositivo de armazenamento e podem ser encontradas, por exemplo, usando um utilitário de recuperação de disco.

Suponha, por exemplo, que o arquivo que você está apagando contenha senhas de produção e precise ser excluído imediatamente após a conclusão da operação atual.

O preenchimento zero do arquivo depois que você o usa ajuda a garantir que as informações confidenciais sejam destruídas.

Em um projeto recente, usamos o código a seguir, que funciona bem para pequenos arquivos de texto. Ele substitui o conteúdo existente por linhas de zeros.

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

Observe que o preenchimento zero não garantirá sua segurança. Se você estiver realmente preocupado, é melhor preencher o zero e usar um utilitário especializado como o File Shredder ou o CCleaner para limpar o espaço 'vazio' da sua unidade.

usuario
fonte
0

Você não pode "apagar" de um arquivo no local, a menos que precise apagar o final. Satisfaça-se com uma substituição de um valor "vazio" ou leia as partes do arquivo que lhe interessam e grave-as em outro arquivo.

Ignacio Vazquez-Abrams
fonte
ok como sobrescrever sem dar valor ao lixo? Quero dizer suponha que um comprimento de seqüência de 9 está lá e estou substituindo-o com comprimento de seqüência de 6. isso significaria 3 valores de lixo rt?
Hick
Corrigir. Além disso, você teria que ter alguma maneira de identificar para qualquer leitor o fato de que esses três caracteres são lixo.
Ignacio Vazquez-Abrams
o fato é que meu código é estendido entre python e c ++. por isso, se uma leitura arquivo é feito em C ++ e gravação de arquivos em python .. tanto o tempo que o arquivo tem que ser apagado ..
Hick
0

Como os arquivos de texto são seqüenciais, você não pode apagar dados diretamente neles. Suas opções são:

  • A maneira mais comum é criar um novo arquivo. Leia o arquivo original e escreva tudo no novo arquivo, exceto a parte que você deseja apagar. Quando todo o arquivo tiver sido gravado, exclua o arquivo antigo e renomeie o novo arquivo para que ele tenha o nome original.
  • Você também pode truncar e reescrever o arquivo inteiro a partir do ponto em que deseja alterar. Procure apontar que deseja alterar e leia o restante do arquivo na memória. Procure o mesmo ponto, trunque o arquivo e escreva de volta o conteúdo sem a parte que deseja apagar.
  • Outra opção simples é substituir os dados por outros do mesmo tamanho. Para isso, procure a posição exata e escreva os novos dados. A limitação é que ele deve ter exatamente o mesmo comprimento.

Veja o seek/ truncatefunction / método para implementar qualquer uma das idéias acima. Tanto o Python quanto o C têm essas funções.

nosklo
fonte
eu só quero apagar o arquivo inteiro desde o início
Hick
2
Em seguida, basta remover o arquivo. Use os.removeou os.unlinkem python, ou unlinkem C. Outra opção é apenas reabrir o arquivo para gravação ou uso truncate.
Nosklo
0

Escrevendo e lendo o conteúdo do arquivo

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

Funcionou para mim

Mohd Tauovir Khan
fonte
0

Você também pode usar isso (com base em algumas das respostas acima):

file = open('filename.txt', 'w')
file.write('')
file.close

é claro que essa é uma maneira muito ruim de limpar um arquivo porque requer muitas linhas de código, mas acabei de escrever isso para mostrar que isso também pode ser feito nesse método.

feliz codificação!

sujay simha
fonte