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?


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.


#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


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)


10

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

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

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.


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();

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.


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.


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.


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.


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


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!

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.