Modul corect de a scrie o linie de fișiere?

Am'm folosit pentru a face print >>f, "buna"`

Cu toate acestea, se pare că print >> este obtinerea a depreciat. Ce este recomandat mod de a face linia de mai sus?

Actualizare: În ceea ce privește toate aceste răspunsuri cu "\n"...asta e universal sau Unix-specifice? De EXEMPLU, ar trebui să fac `"\r\n" pe Windows?

Comentarii la întrebare (3)
Soluția

Acest lucru ar trebui să fie la fel de simplu ca:

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

Din Documentația:

nu utilizați os.linesep ca o linie terminator atunci când scrieți fișiere deschise în mod text (implicit); folosiți-o singur '\n' în schimb, pe toate platformele.

Ceva util de citit:

Comentarii (10)

Ar trebui să utilizați `print () funcția care este disponibil începând cu Python 2.6+

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

Pentru Python 3 nu't nevoie de "import", din anii `print () funcția este implicit.

Alternativa ar fi să utilizați:

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

Cu referire la Python documentația în ceea ce privește liniile:

La ieșire, dacă newline este Nici unul, nici '\n' caractere scrise sunt traduse în sistemul implicit de linie cu separator,os.linesep. Dacă newline este'', nici o traducere nu are loc. Dacă newline este oricare dintre celelalte valori juridice, orice'\n' caractere scrise sunt traduse în șirul dat.

Comentarii (18)

De python-docs recomanda acest mod:

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

Deci, acest lucru este modul în care mă fac de obicei :)

Declarație de docs.python.org:

este O bună practică de a utiliza 'cu' cuvinte cheie atunci când se ocupă cu dosarul obiecte. Acest lucru are avantajul că fișierul este închis corect după suita sa finisaje, chiar dacă o excepție este ridicată pe drum. Este de asemenea, mult mai scurt decât scrierea echivalent încerca în cele din urmă blocuri.

Comentarii (3)

În ceea ce privește sistemul de operare.linesep:

Aici este exact nemodificat Python 2.7.1 interpret sesiune pe 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'
>>>

Pe Windows:

Cum era de așteptat, sistemul de operare.linesep nu NU produce același rezultat ca în '\n'. Nu există nici un fel că s-ar putea produce același rezultat. 'salut' + sistem de operare.linesep este echivalent cu 'salut\r\n', care este **NU** echivalent cu'hi acolo\n'`.

It's simplu: foloseste \n, care va fi tradus în mod automat de sistemul de operare.linesep. Și-l's a fost atât de simplu din primul port de Python pentru Windows.

Nu există nici un punct în utilizarea sistemului de operare.linesep pe non-sistemele de operare Windows, și produce rezultate greșite pe Windows.

NU UTILIZAȚI sistemul de operare.linesep!

Comentarii (7)

Nu cred că există o "corect" mod.

Mi-ar folosi:

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

In memoriam Tim Lingușitor.

Comentarii (7)

În Python 3 este o funcție, dar în Python 2, puteți adăuga acest la partea de sus a fișier sursă:

from __future__ import print_function

Apoi faci

print("hi there", file=f)
Comentarii (0)

Dacă sunteți scris o mulțime de date și viteza este un motiv de îngrijorare ar trebui să te duci cu f.scrie(...). Am făcut o scurtă comparație de viteză și a fost considerabil mai repede decât print(..., file=f) atunci când se efectuează un număr mare de scrie.

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)

În medie scrie` terminat în 2.45 s pe masina mea, întrucâtprint`` a luat aproximativ 4 ori mai mult (9.76 s). Acestea fiind spuse, în cele mai multe scenarii reale acest lucru nu va fi o problemă.

Dacă alegeți să mergeți cu print(..., file=f) veți găsi, probabil, că'll a vrut să suprime newline din timp în timp, sau să o înlocuiască cu altceva. Acest lucru poate fi realizat prin setarea opțional end parametru, de exemplu;

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

Oricum ai alege I'd sugerează utilizarea cu, deoarece acesta face codul mai ușor de citit.

Update: Această diferență în performanță se explică prin faptul că a scrie este extrem de tampon și se întoarce înainte de orice scrie pe disc avea loc (a se vedea acest răspuns), întrucât print (probabil) utilizează linia de tamponare. Un test simplu pentru acest lucru ar fi pentru a verifica performanta pentru mult timp, scrie la fel de bine, în cazul în care dezavantajele (în termeni de viteză) pentru linia de tamponare ar fi mai puțin pronunțată.

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")

Diferenta de performanta devine acum mult mai puțin pronunțată, cu un timp mediu de 2.20 pentru scrie` și 3.10 sprint. Dacă aveți nevoie pentru a înlănțui un grup de siruri de caractere pentru a obține această lungă linie de performanta va avea de suferit, asa ca foloseste-cazuri în careprint`` ar fi mai eficient sunt un pic mai rare.

Comentarii (0)

Deoarece 3.5 puteți utiliza, de asemenea, [pathlib][1] pentru acest scop:

Calea.write_text(date, codificare=Nici unul, erori=None)

Deschide fișierul indicat în modul text, scrie date pe ea, și închideți fișierul:

import pathlib

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

[1]: https://docs.python.org/3/library/pathlib.html#pathlib.Path.write_text

Comentarii (0)

Când ai spus că Linia aceasta înseamnă seria unor personaje care s-au încheiat la '\n' caractere. Linie ar trebui să fie trecută la un moment dat, așa că ar trebui să ia în considerare '\n' la sfârșitul fiecărui rând. Aici este soluția:

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

în modul de adăugare după fiecare scrie cursorul trece la linie nouă, dacă doriți să utilizați 'g' modul ar trebui să adăugați '\n' caractere la sfârșitul scrie funcția ():

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

Se poate folosi, de asemenea, io modul ca în:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
Comentarii (0)

Puteți încerca, de asemenea, filewriter

pip instala filewriter

`` din filewriter import Scriitor

Scriitor(filename='my_file', ext='txt') << ["rândul 1 hi acolo", "randul 2"] ` Scrie în my_file.txt

Are o iterable sau un obiect cu `str sprijinul.

Comentarii (0)

Când am nevoie pentru a scrie noi linii mult, am defini-o lambda care utilizează un "print" funcția:

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

Această abordare are avantajul că se poate utiliza toate caracteristicile care sunt disponibile cu "imprimare" funcția.

Actualizare: după Cum este menționat de către Gheorghi în secțiunea de comentarii, este posibil pentru a îmbunătăți această idee mai departe cu "parțial" funcția:

from functools import partial
fwl = partial(print, file=out)

IMHO, asta e un mod mai funcțional și mai puțin criptic abordare.

Comentarii (3)