Estou acostumado a fazer print >>f, "hi there"
No entanto, parece que print >>
está sendo preterido. Qual é a maneira recomendada de fazer a linha acima?
Atualização : Em relação a todas essas respostas com "\n"
... isso é universal ou específico para Unix? IE, devo fazer "\r\n"
no Windows?
Respostas:
Isso deve ser tão simples quanto:
Da documentação:
Alguma leitura útil:
with
declaraçãoopen()
os
(particularmenteos.linesep
)fonte
with
é uma maneira mais segura de lembrar de fechar um arquivo.the_file.close()
?Você deve usar a
print()
função que está disponível desde o Python 2.6+Para o Python 3, você não precisa do
import
, pois aprint()
função é o padrão.A alternativa seria usar:
Citando a documentação do Python sobre novas linhas:
fonte
\n
" exigiria newline = "" caso contrário, você acessará o\r\r\n
Windows. Não há razão para brincar com o os.linesep.\r\n
que contém o\n
que é traduzido para os.linesep, o que significa que\r\n
o resultado final é\r\r\n
.open('myfile','a')
, em vezopen('myfile','w')
?Os documentos python recomendam desta maneira:
Então é assim que eu costumo fazer :)
Declaração de docs.python.org :
fonte
with
interior de um loop. Isso me faz constantemente abrir e fechar o arquivo à medida que prossigo no meu loop. Talvez esteja faltando alguma coisa aqui, ou isso é realmente uma desvantagem nesse cenário específico?Em relação ao os.linesep:
Aqui está uma sessão exata do intérprete não editada do Python 2.7.1 no Windows:
No Windows:
Como esperado, o 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: o uso
\n
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 produz resultados incorretos no Windows.
NÃO USE os.linesep!
fonte
os.linesep
no Windows no modo de texto, o resultado\r\r\n
está errado. "O Windows usa ..." não tem sentido. A biblioteca C tempo de execução (e, portanto, Python) traduzir\n
para\r\n
a saída em modo texto. Outro software pode se comportar de maneira diferente. NÃO é o caso de todos os softwares em execução no Windows reconhecerem um solitário\n
como um separador de linhas ao ler no modo de texto. Python faz. O editor de texto do bloco de notas da Microsoft não.\r
...os.linesep
é "errado" aqui. É comoDepartment of Redundancy Department
. Sim, você pode fazer isso. Não, você não quer.Eu não acho que exista uma maneira "correta".
Eu usaria:
Em memória de Tim Toady .
fonte
with
sair do escopo.open(..., 'a')
ou até'at'
.No Python 3, é uma função, mas no Python 2 você pode adicioná-lo à parte superior do arquivo de origem:
Então você faz
fonte
Se você está escrevendo muitos dados e a velocidade é uma preocupação, provavelmente você deve concordar
f.write(...)
. Fiz uma comparação rápida de velocidade e foi consideravelmente mais rápida do queprint(..., file=f)
na execução de um grande número de gravações.Em média,
write
terminei em 2,45s na minha máquina, enquantoprint
demorou cerca de 4 vezes mais (9,76s). Dito isto, na maioria dos cenários do mundo real, isso não será um problema.Se você optar por acompanhá-
print(..., file=f)
lo, provavelmente descobrirá que deseja suprimir a nova linha de tempos em tempos ou substituí-la por outra. Isso pode ser feito configurando oend
parâmetro opcional , por exemplo;Qualquer que seja a maneira que você escolher, sugiro usar,
with
pois torna o código muito mais fácil de ler.Atualização : Essa diferença de desempenho é explicada pelo fato de
write
ser altamente armazenado em buffer e retornar antes que qualquer gravação no disco ocorra (consulte esta resposta ), enquantoprint
(provavelmente) usa o buffer de linha. Um teste simples para isso seria verificar o desempenho também para gravações longas, onde as desvantagens (em termos de velocidade) do buffer de linha seriam menos pronunciadas.A diferença de desempenho agora se torna muito menos acentuada, com um tempo médio de 2,20s para
write
e 3,10s paraprint
. Se você precisar concatenarprint
várias seqüências de caracteres para obter esse desempenho muito longo da linha, os casos de uso em que seria mais eficiente são um pouco raros.fonte
Desde o 3.5, você também pode usar o
pathlib
para esse fim:fonte
Quando você disse Linha, significa alguns caracteres serializados que terminam em '\ n'. A linha deve ser a última em algum momento; portanto, devemos considerar '\ n' no final de cada linha. Aqui está a solução:
no modo de acréscimo após cada gravação, o cursor se move para a nova linha; se você quiser usar o
w
modo, adicione\n
caracteres no final dawrite()
função:fonte
Pode-se também usar o
io
módulo como em:fonte
Para escrever texto em um arquivo no balão, pode ser usado:
fonte
Você também pode tentar
filewriter
pip install filewriter
Grava em
my_file.txt
Pega um objeto iterável ou com
__str__
suporte.fonte
Quando preciso escrever muitas linhas novas, defino um lambda que usa uma
print
função:Essa abordagem tem o benefício de poder utilizar todos os recursos disponíveis com a
print
função.Atualização: Como mencionado por Georgy na seção de comentários, é possível melhorar ainda mais essa idéia com a
partial
função:IMHO, esta é uma abordagem mais funcional e menos enigmática.
fonte
from functools import partial; fwl = partial(print, file=out)
.