Teraz używam:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Ale żeby kod wyglądał lepiej, mogę:
output = open('pagehead.section.htm','r').read()
W przypadku korzystania z powyższej składni, jak zamknąć plik, aby zwolnić zasoby systemowe?
contents = os.readfile(path)
. Gdybym chciał zrobić coś bardziej wyszukanego, to ok, chętnie bym skorzystałwith open(path) as fd: contents = fd.read()
. Oczywiście można napisać własny wrapper, ale po to jest rdzeń, aby zapewnić programistom użyteczne elementy abstrakcji.Odpowiedzi:
Naprawdę nie musisz go zamykać - Python zrobi to automatycznie podczas czyszczenia pamięci lub przy wyjściu z programu. Ale jak zauważył @delnan, lepiej jest jawnie zamknąć go z różnych powodów.
Co więc możesz zrobić, aby było krótkie, proste i wyraźne:
Myślę, że to tylko dwie linijki i całkiem czytelne.
źródło
with
instrukcji , zasób pliku zostanie poprawnie zamknięty.output = f.read()
część w tej samej linii po:
.Moduł Python Standard Library Pathlib robi to, czego szukasz:
Nie zapomnij zaimportować ścieżki:
W Pythonie 27 zainstaluj backported
pathlib
lubpathlib2
źródło
with
są w porządku, alewith
są stwierdzeniem, a nie wyrażeniem. Tapathlib
odpowiedź jest jedyną odpowiedzią na pierwotne pytanie, które można osadzić w wyrażeniu Pythona. Coś jakSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
Używając CPythona, twój plik zostanie zamknięty natychmiast po wykonaniu linii, ponieważ obiekt pliku jest natychmiast usuwany. Są jednak dwie wady:
W implementacjach Pythona innych niż CPython, plik często nie jest natychmiast zamykany, ale raczej w późniejszym czasie, poza twoją kontrolą.
W Pythonie 3.2 lub nowszym spowoduje to wyświetlenie pliku
ResourceWarning
, jeśli jest włączony.Lepiej zainwestować jedną dodatkową linię:
Zapewni to prawidłowe zamknięcie pliku w każdych okolicznościach.
źródło
Nie ma potrzeby importowania żadnych specjalnych bibliotek, aby to zrobić.
Użyj normalnej składni, a otworzy plik do odczytu, a następnie zamknie go.
lub
co daje tablicę x zawierającą wiersze i można ją wydrukować w następujący sposób:
Te jednowierszowe są bardzo pomocne w konserwacji - zasadniczo dokumentują się samodzielnie.
źródło
Możesz użyć
with
instrukcji i zapisać dwa kroki w jednej linii:with
Oświadczenie zadba, aby zadzwonić do__exit__
funkcji danego obiektu, nawet jeśli coś złego się wydarzyło w kodzie; jest zbliżona dotry... finally
składni. Dla obiektu zwróconego przezopen
,__exit__
odpowiada zamknięciu pliku.Ta instrukcja została wprowadzona w Pythonie 2.6.
źródło
with
został wprowadzony w Pythonie 2.5, ale musiał zostać wyraźnie zaimportowany z__future__
. Stało się dostępne we wszystkich kontekstach w Pythonie 2.6.użyj ilio : (inline io):
tylko jedno wywołanie funkcji zamiast file open (), read (), close ().
źródło
źródło
python -c
w wierszu poleceń, więc publikowanie 2-wierszowych odpowiedzi nie pomaga."
, użyć;
do dołączenia dwóch instrukcji i usunąć znak nowej linii po:
? Następujące wyrażenie działa dla mnie dobrze:$> python -c "with open('some file', 'r') as f: print(next(f))"
Myślę, że najbardziej naturalnym sposobem osiągnięcia tego jest zdefiniowanie funkcji.
Następnie możesz wykonać następujące czynności:
źródło
Często robię coś takiego, gdy potrzebuję kilku wierszy otaczających coś, co grepowałem w pliku dziennika:
źródło
grep -A <n>
,grep -B <n>
igrep -C <n>
, jeżeli jest to pomocne. Więcej informacji: stackoverflow.com/a/9083/1830159Za pomocą
more_itertools.with_iter
można otwierać, czytać, zamykać i przypisywać odpowiednikoutput
w jednej linii (z wyłączeniem instrukcji import):Chociaż jest to możliwe, szukałbym innego podejścia niż przypisanie zawartości pliku do zmiennej, tj. Leniwej iteracji - można to zrobić za pomocą tradycyjnego
with
bloku lub w powyższym przykładzie, usuwającjoin()
i iterującoutput
.źródło
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Działa to dobrze i eliminuje potrzebę tworzenia wiersza do importu.Jeśli chcesz tego ciepłego i rozmytego uczucia, po prostu idź z tym .
W przypadku Pythona 3.6 uruchomiłem te dwa programy na nowym początku IDLE, dając środowiska wykonawcze:
Więc nie ma to wielkiej różnicy.
WYNIK:
WYNIK:
źródło