Forma correcta de escrever linha a ficheiro?

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

No entanto, parece que print >> está a ficar desacreditado. Qual é a forma recomendada de fazer a linha acima?

actualizar : Em relação a todas essas respostas com "\n" ... isto é universal ou específico do Unix? Ou seja, eu deveria estar fazendo "\r\n" em janelas?

Author: martineau, 2011-05-28

10 answers

Isto deve ser tão simples como:

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

Da Documentação:

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

Algumas leituras úteis:
 744
Author: Johnsyweb, 2017-10-11 10:46:58

Deve usar a função print() que está disponível desde o Python 2. 6+

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Para o Python 3 você não precisa da import, Uma vez que a função print() é a predefinida.

A alternativa seria usar:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

Citando a documentação em Python sobre as novas linhas:

No resultado, se a newline não for nenhuma, quaisquer caracteres '\n' escritos são traduzidos para o separador de linhas predefinido do sistema, os.linesep. Se a newline for '', nenhuma tradução ocorrer. Se newline for algum dos outros valores legais, quaisquer caracteres '\n' escritos são traduzidos para a cadeia de caracteres indicada.

 911
Author: sorin, 2017-01-01 21:19:59

Odocumento python recomenda desta forma:

with open('file_to_write', 'w') as f:
    f.write('file contents')
Então é assim que eu costumo fazer.

Declaração de docs.python.org:

É boa prática usar a palavra-chave com' quando se lida com um ficheiro objecto. Isto tem a vantagem de que o arquivo é devidamente fechado após sua suíte termina, mesmo que uma exceção seja levantada no caminho. É também muito mais curto do que escrever equivalentes tentativa-finalmente blocos.

 95
Author: j7nn7k, 2018-06-14 13:46:25

Em relação ao sistema operacional.linesep:

Aqui está uma sessão de interpretação exacta não editada em Python 2.7.1 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'
>>>

Nas Janelas:

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

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

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

Não utilize os.linesep!

 80
Author: John Machin, 2011-05-29 03:02:48
Acho que não há uma maneira "correcta".

Eu usaria:

with open ('myfile', 'a') as f: f.write ('hi there\n')

Em memóriaTim Toady .

 46
Author: Hyperboreus, 2011-05-28 05:54:10

No Python 3 é uma função, mas no Python 2 pode adicionar isto ao topo do ficheiro de código:

from __future__ import print_function

Então você faz

print("hi there", file=f)
 17
Author: Keith, 2011-05-28 05:49:25

Se você está escrevendo um monte de dados e velocidade é uma preocupação que você provavelmente deve ir com f.write(...). Eu fiz uma rápida comparação de velocidade e foi consideravelmente mais rápido do que print(..., file=f) ao realizar um grande número de escritas.

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 write terminou em 2,45 s na minha máquina, enquanto print demorou cerca de 4 vezes mais (9,76 s). Dito isto, na maioria dos cenários do mundo real, esta não será uma questão.

Se escolheres ir com print(..., file=f) provavelmente descobrirás que vais querer suprimir a newline de vez em quando, ou substituí-la por outra coisa. Isto pode ser feito definindo o parâmetro opcional end, 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 escolheres, sugiro usar {[[9]} uma vez que torna o código muito mais fácil de ler.

Update: esta diferença de desempenho é explicada pelo facto de write ser altamente tamponado e retornar antes de qualquer escrita no disco realmente acontecer (ver esta resposta ), enquanto print (provavelmente) usa a linha tampao. Um teste simples para isso seria verificar o desempenho de escritas longas também, onde as desvantagens (em termos de velocidade) para o buffer de linha seria menos pronunciada.

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 torna-se agora muito menos pronunciada, com um tempo médio de 2,20 s para write e 3,10 s para print. Se você precisar concatenar um monte de cordas para obter este desempenho looong linha vai sofrer, então os casos de uso onde print seria mais eficiente são um pouco raros.

 14
Author: Robin Keskisarkka, 2017-09-15 09:17:16
Quando disseste linha, significa alguns caracteres serializados que acabam em caracteres' \n'. A linha deve ser última em algum momento, por isso 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 Adicionar depois de cada gravação, o cursor move-se para uma nova linha, se quiser usar o modo 'w' deverá adicionar caracteres' \n ' no final da função write ():

the_file.write('Hello'+'\n')
 5
Author: Reza Tanzifi, 2016-08-26 14:44:36

Desde 3, 5 também pode usar o pathlib para esse fim:

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

Abra o ficheiro apontado no modo de texto, escreva os dados para ele e feche o ficheiro:

import pathlib

pathlib.Path('textfile.txt').write_text('content')
 1
Author: johnson, 2018-10-11 05:51:53

Também se pode usar o módulo io como em:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
 0
Author: kmario23, 2018-08-29 14:37:20