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:
- A declaração
with
-
open()
- 'a' é para acrescentar ou usar
- 'w' para escrever com truncagem
-
os
(particularmenteos.linesep
)
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!