python - titulo - Maneira correta de escrever linha para arquivo?




title tag e title heading (7)

Estou acostumado a fazer print >>f, "hi there"

No entanto, parece que a print >> está ficando obsoleta. Qual é a maneira recomendada de fazer a linha acima?

Atualização : Em relação a todas as respostas com "\n" ... isso é universal ou específico do Unix? IE, eu deveria estar fazendo "\r\n" no Windows?


A documentação do python recomenda isso:

with open('file_to_write', 'w') as f:
    f.write('file contents')

Então é assim que costumo fazer :)

Declaração de docs.python.org :

É uma boa prática usar a palavra-chave 'with' ao lidar com objetos de arquivo. Isso tem a vantagem de o arquivo ser fechado corretamente após o término de sua suíte, mesmo que uma exceção seja levantada no caminho. Também é muito mais curto do que escrever blocos try-finally equivalentes.


Desde 3.5, você também pode usar o pathlib para essa finalidade:

Path.write_text (dados, codificação = Nenhum, erros = Nenhum)

Abra o arquivo apontado no modo de texto, escreva os dados nele e feche o arquivo:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

Isso deve ser tão simples quanto:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

Da documentação:

Não use os.linesep como um terminador de linha ao gravar arquivos abertos no modo de texto (o padrão); use um único '\ n' em vez disso, em todas as plataformas.

Alguma leitura útil:


No Python 3, é uma função, mas no Python 2 você pode adicionar isso ao topo do arquivo de origem:

from __future__ import print_function

Então você faz

print("hi there", file=f)

Quando você disse Line, significa alguns caracteres serializados que são terminados em caracteres '\ n'. A linha deve ser a última em algum ponto, então devemos considerar '\ n' no final de cada linha. Aqui está a solução:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

no modo de acréscimo após cada gravação o cursor se move para a nova linha, se você quiser usar o modo 'w' você deve adicionar caracteres '\ n' no final da função write ():

the_file.write('Hello'+'\n')

Se você está escrevendo muitos dados e velocidade é uma preocupação, você deve provavelmente ir com f.write(...) . Fiz uma comparação rápida de velocidade e foi consideravelmente mais rápida do que print(..., file=f) ao executar um grande número de gravações.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

Em média, a write terminou em 2,45s na minha máquina, enquanto a print demorou cerca de 4 vezes mais tempo (9,76s). Dito isto, na maioria dos cenários do mundo real, isso não será um problema.

Se você optar por print(..., file=f) , provavelmente descobrirá que vai querer suprimir a nova linha de tempos em tempos ou substituí-la por outra. Isso pode ser feito definindo o parâmetro end opcional, por exemplo;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

Seja qual for a maneira que você escolher eu sugiro usar with desde que torna o código muito mais fácil de ler.

Atualização : Essa diferença no desempenho é explicada pelo fato de que a write é altamente armazenada em buffer e retorna antes que quaisquer gravações em disco realmente ocorram (veja essa resposta ), enquanto que a print (provavelmente) usa o buffer de linha. Um teste simples para isso seria verificar o desempenho de gravações longas também, onde as desvantagens (em termos de velocidade) do buffer de linha seriam menos pronunciadas.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

A diferença de desempenho agora se torna muito menos pronunciada, com um tempo médio de 2,20 para a write e 3,10 para a print . Se você precisar concatenar um monte de strings para obter esse desempenho de linha loooong, será prejudicado, portanto, os casos de uso em que a print seria mais eficiente são um pouco raros.


Em relação ao os.linesep:

Aqui está uma sessão de intérprete do Python 2.7.1 não editada no Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

No Windows:

Como esperado, os.linesep NÃO produz o mesmo resultado que '\n' . Não há como produzir o mesmo resultado. 'hi there' + os.linesep é equivalente a 'hi there\r\n' , que NÃO é equivalente a 'hi there\n' .

É simples assim: use \n que será traduzido automaticamente para os.linesep. E tem sido tão simples desde a primeira porta do Python para o Windows.

Não faz sentido usar o os.linesep em sistemas não-Windows, e isso produz resultados errados no Windows.

NÃO USE os.linesep!







file-io