#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.
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.
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.
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.
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"ifnot 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 filereturn text
é 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.
Respostas:
Em python:
Ou, como alternativa, se você já possui um arquivo aberto:
Em C ++, você poderia usar algo semelhante.
fonte
#include<fstream>
e depoisstd::ofstream("file.txt");
tão curto quanto em Python. :)f.seek(0)
depoisf.truncate(0)
; caso contrário, você terá \ x00 estranhos anexados no início do arquivo.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
fonte
A abertura de um arquivo no modo "gravação" o limpa, você não precisa especificamente gravar nele:
(você deve fechá-lo, pois o momento em que o arquivo é fechado automaticamente pode ser específico da implementação)
fonte
Do usuário @jamylak, uma forma alternativa
open("filename","w").close()
éfonte
Ao usar
with open("myfile.txt", "r+") as my_file:
, recebo zeros estranhosmyfile.txt
, principalmente porque estou lendo o arquivo primeiro. Para que funcionasse, tive que mudar primeiro o ponteiromy_file
para o início do arquivo commy_file.seek(0)
. Então eu poderia fazermy_file.truncate()
para limpar o arquivo.fonte
Você precisa substituir o arquivo. Em C ++:
fonte
close()
ligação. O destruidor fechará o arquivo. Então você só precisa criar um temporária:ofstream("test.txt");
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 cstdio.h
é o que você está procurando lá. Não tenho certeza sobre Python.fonte
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.
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.
fonte
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.
fonte
Como os arquivos de texto são seqüenciais, você não pode apagar dados diretamente neles. Suas opções são:
Veja o
seek
/truncate
function / método para implementar qualquer uma das idéias acima. Tanto o Python quanto o C têm essas funções.fonte
os.remove
ouos.unlink
em python, ouunlink
em C. Outra opção é apenas reabrir o arquivo para gravação ou usotruncate
.Escrevendo e lendo o conteúdo do arquivo
Funcionou para mim
fonte
Você também pode usar isso (com base em algumas das respostas acima):
é 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!
fonte