Jestem przyzwyczajony do robienia print >>f, "hi there"
Wydaje się jednak, że print >>
staje się przestarzałe. Jaki jest zalecany sposób wykonania powyższej linii?
Aktualizacja : Odnośnie wszystkich tych odpowiedzi za pomocą "\n"
... czy jest to uniwersalne czy specyficzne dla Uniksa? IE, powinienem robić "\r\n"
w systemie Windows?
Odpowiedzi:
Powinno to być tak proste, jak:
Z dokumentacji:
Kilka przydatnych lektur:
with
oświadczenieopen()
os
(szczególnieos.linesep
)źródło
with
jest bezpieczniejszym sposobem na zapamiętanie zamknięcia pliku.the_file.close()
?Należy użyć
print()
funkcji, która jest dostępna od wersji Python 2.6+W przypadku Python 3 nie jest to potrzebne
import
, ponieważprint()
funkcja jest domyślna.Alternatywą byłoby użycie:
Cytowanie z dokumentacji Pythona dotyczące nowych linii:
źródło
\n
" wymagałoby newline = "" w przeciwnym razie dostaniesz się\r\r\n
na Windows. Z os.linesep nie ma w ogóle powodu, aby się wygłupiać.\r\n
które zawiera,\n
co jest tłumaczone na os.linesep, co jest\r\n
końcowym wynikiem\r\r\n
.open('myfile','a')
zamiast tegoopen('myfile','w')
?Dokumenty pythonowe polecają w ten sposób:
Tak zwykle to robię :)
Oświadczenie z docs.python.org :
źródło
with
wewnętrzną pętlę. To sprawia, że ciągle otwieram i zamykam plik podczas pracy w pętli. Może coś mi brakuje, czy to naprawdę wada w tym konkretnym scenariuszu?W odniesieniu do os.linesep:
Oto dokładnie niezredagowana sesja interpretera języka Python 2.7.1 w systemie Windows:
W systemie Windows:
Zgodnie z oczekiwaniami os.linesep NIE daje tego samego wyniku co
'\n'
. Nie ma możliwości, aby przyniosło to ten sam rezultat.'hi there' + os.linesep
jest równoważne z'hi there\r\n'
, co NIE jest równoważne z'hi there\n'
.To takie proste: użycie,
\n
które zostanie automatycznie przetłumaczone na os.linesep. Od pierwszego portu Pythona w systemie Windows jest to takie proste.Nie ma sensu używać os.linesep w systemach innych niż Windows, a wyniki są nieprawidłowe w systemie Windows.
NIE UŻYWAJ os.linesep!
źródło
os.linesep
w systemie Windows w trybie tekstowym, wynik\r\r\n
jest niewłaściwy. „Windows używa ...” jest bez znaczenia. Biblioteka C Runtime (a więc Python) przekładają\n
się\r\n
na wyjściu w trybie tekstowym. Inne oprogramowanie może zachowywać się inaczej. NIE jest tak, że całe oprogramowanie działające w systemie Windows rozpoznaje samotność\n
jako separator linii podczas czytania w trybie tekstowym. Python robi. Edytor tekstu Microsoft Notepad nie.\r
...os.linesep
jest tutaj „złe”. To jest jakDepartment of Redundancy Department
. Tak, możesz to zrobić. Nie, nie chcesz.Nie sądzę, że istnieje „poprawny” sposób.
Użyłbym:
Na pamiątkę Tim Toady .
źródło
with
wyjdzie poza zakres.open(..., 'a')
lub nawet'at'
.W Pythonie 3 jest to funkcja, ale w Pythonie 2 możesz dodać to na górze pliku źródłowego:
To robisz
źródło
Jeśli piszesz dużo danych, a szybkość jest problemem, prawdopodobnie powinieneś iść
f.write(...)
. Zrobiłem szybkie porównanie prędkości i było ono znacznie szybsze niżprint(..., file=f)
podczas wykonywania dużej liczby zapisów.Średnio
write
skończyłem na 2,45 s na moim komputerze, podczas gdyprint
zajęło to około 4 razy dłużej (9,76 s). To powiedziawszy, w większości rzeczywistych scenariuszy nie będzie to problemem.Jeśli zdecydujesz się iść z
print(..., file=f)
tym, prawdopodobnie okaże się, że będziesz chciał od czasu do czasu wyłączyć nową linię lub zastąpić ją inną. Można tego dokonać ustawiając opcjonalnyend
parametr, np.;Jakikolwiek sposób wybierzesz, sugeruję użycie,
with
ponieważ znacznie ułatwia odczytanie kodu.Aktualizacja : Ta różnica w wydajności jest wyjaśniona faktem, że
write
jest wysoce buforowana i powraca zanim nastąpi jakikolwiek zapis na dysk (zobacz tę odpowiedź ), podczas gdyprint
(prawdopodobnie) używa buforowania linii. Prostym testem byłoby sprawdzenie wydajności również przy długich zapisach, gdzie wady (pod względem prędkości) buforowania linii byłyby mniej wyraźne.Różnica wydajności staje się teraz znacznie mniej wyraźna, ze średnim czasem 2,20 s dla
write
3,10 s dlaprint
. Jeśli musisz połączyć kilka ciągów, aby uzyskać tę dłuższą wydajność linii, ucierpi, więc przypadki użycia, któreprint
byłyby bardziej wydajne, są nieco rzadkie.źródło
Od wersji 3.5 możesz również użyć
pathlib
do tego celu:źródło
Kiedy powiedziałeś „Linia”, oznacza to niektóre zserializowane znaki, które kończą się na „\ n”. Linia powinna być w pewnym momencie ostatnia, więc powinniśmy rozważyć „\ n” na końcu każdej linii. Oto rozwiązanie:
w trybie dołączania po każdym zapisie kursor przechodzi do nowej linii, jeśli chcesz użyć
w
trybu, powinieneś dodać\n
znaki na końcuwrite()
funkcji:źródło
Można również użyć
io
modułu jak w:źródło
Do pisania tekstu w pliku w kolbie można użyć:
źródło
Możesz także spróbować
filewriter
pip install filewriter
Zapisuje w
my_file.txt
Wykonuje iterację lub obiekt z
__str__
obsługą.źródło
Kiedy muszę dużo pisać nowe linie, definiuję lambda, która korzysta z
print
funkcji:Podejście to ma tę zaletę, że może wykorzystywać wszystkie funkcje dostępne w
print
funkcji.Aktualizacja: Jak wspomniał Georgy w sekcji komentarzy, można ulepszyć ten pomysł za pomocą
partial
funkcji:IMHO, jest to bardziej funkcjonalne i mniej tajemnicze podejście.
źródło
from functools import partial; fwl = partial(print, file=out)
.