Atualmente estou usando este:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Mas o problema é que o arquivo antigo é maior do que o novo. Então, acabo com um novo arquivo que tem uma parte do arquivo antigo no final.
f.write(text)
depoisf.truncate()
?f.write(text)
é anteriorf.truncate()
neste código; ele escreve otext
primeiro, portanto,.write()
o cursor do arquivo é posicionado no final detext
. Prosseguir para truncar o arquivo removerá quaisquer bytes restantes que o arquivo possa ter após esse ponto. Neste caso, o resultado final seria o mesmo que truncado antes de escrever.fileinput
módulo pode se tornar o método preferido. Quando aprovadoinplace=1
, ele moverá o arquivo para um local temporário primeiro e, em seguida, gravará um novo arquivo no caminho do nome antigo. Esta operação de movimentação é rápida em sistemas de arquivos unix, porque ela apenas move o sistema de arquivosinode
, não o conteúdo completo. Então você pode ler e processar cada linha individualmente para evitar o inchaço da memória. :-)Provavelmente seria mais fácil e organizado fechar o arquivo depois
text = re.sub('foobar', 'bar', text)
, reabri-lo para escrever (apagando assim o conteúdo antigo) e escrever o texto atualizado nele.fonte
O
fileinput
módulo tem uminline
modo para gravar alterações no arquivo que você está processando sem usar arquivos temporários etc. O módulo encapsula muito bem a operação comum de loop nas linhas de uma lista de arquivos, por meio de um objeto que controla de forma transparente o nome do arquivo, número da linha, etc, se desejar inspecioná-los dentro do loop.fonte
Honestamente, você pode dar uma olhada nesta classe que criei que faz operações básicas de arquivo. O método write substitui e append mantém os dados antigos.
fonte
Tente gravá-lo em um novo arquivo.
fonte