W Rubim możesz czytać z pliku za pomocą s = File.read(filename)
. Najkrótszy i najbardziej przejrzysty, jaki znam w Pythonie, to
with open(filename) as f:
s = f.read()
Czy jest jakiś inny sposób, aby to zrobić, aby był jeszcze krótszy (najlepiej jedna linia) i bardziej czytelny?
Uwaga: początkowo sformułowałem pytanie jako „robię to w jednej linii kodu”. Jak zauważył S.Lott, krótszy nie musi oznaczać bardziej czytelnego. Więc przeformułowałem moje pytanie, aby wyjaśnić, co mam na myśli. Myślę, że kod Ruby jest lepszy i bardziej czytelny niekoniecznie dlatego, że jest to jedna linia kontra dwie (choć to też ma znaczenie), ale także dlatego, że jest to metoda klasowa w przeciwieństwie do metody instancji, która nie stawia pytania o to, kto zamyka plik, jak upewnić się, że zostanie zamknięty, nawet jeśli zostanie zgłoszony wyjątek itp. Jak wskazano w poniższych odpowiedziach, możesz polegać na GC, aby zamknąć plik (czyniąc go tym samym jednowierszowym), ale to jeszcze bardziej pogarsza kod chociaż jest krótszy. Nie tylko dlatego, że nie da się go przenosić, ale też czyniąc to niejasnym.
with
instrukcją w 2.5). Może jest sposób, może nie ma. Zawsze mogę spróbować się dowiedzieć, prawda? Jeśli ci się to nie podoba, zagłosuj przeciw i przejdź dalej. :)File.readlines("filename")
jest to, że czyta zawartość pliku, podając jego nazwę. Nigdzie nie ma uchwytu pliku, deskryptora ani obiektu. Wszystkie „odpowiedniki” Pythona, które widziałem, obejmują jawne otwarcie / zamknięcie (lub, co gorsza, niejawne otwarcie, które wymaga jawnego zamknięcia).Odpowiedzi:
Jeśli jesteś otwarty na używanie bibliotek, spróbuj zainstalować rozwidloną ścieżkę (z easy_install lub pip).
Następnie możesz:
from path import path s = path(filename).bytes()
Ta biblioteka jest dość nowa, ale jest to rozwidlenie biblioteki, która od lat unosi się w Pythonie i była dość często używana. Odkąd znalazłem tę bibliotekę lata temu, bardzo rzadko używam
os.path
lub wopen()
ogóle.źródło
0777
Zamiast0o0777
) nie jest obsługiwany przez moją obecną wersję Pythona.with open('x.py') as f: s = f.read()
*** uśmiecha się ***
źródło
Działa tak samo jak powyżej, ale nie obsługuje błędów:
s = open(filename, 'r').read()
źródło
Użyj pathlib .
Python 3.5 i nowsze:
from pathlib import Path contents = Path(file_path).read_text()
W przypadku niższych wersji Pythona użyj pathlib2 :
Następnie
from pathlib2 import Path contents = Path(file_path).read_text()
Pisanie jest równie łatwe:
Path(file_path).write_text('my text')
źródło
contents = open(filename).read()
źródło
open(...)
jest zbierany jako śmieci. Niech ktoś mnie poprawi, jeśli się mylę.To nie jest Perl; nie chcesz na siłę dopasowywać wartości wielu wierszy kodu do jednej linii. Napisz funkcję, a następnie wywołanie funkcji pobiera jedną linię kodu.
def read_file(fn): """ >>> import os >>> fn = "/tmp/testfile.%i" % os.getpid() >>> open(fn, "w+").write("testing") >>> read_file(fn) 'testing' >>> os.unlink(fn) >>> read_file("/nonexistant") Traceback (most recent call last): ... IOError: [Errno 2] No such file or directory: '/nonexistant' """ with open(fn) as f: return f.read() if __name__ == "__main__": import doctest doctest.testmod()
źródło
Powolny, brzydki, specyficzny dla platformy ... ale jednolinijkowy ;-)
import subprocess contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]
źródło
Takie proste:
f=open('myfile.txt') s=f.read() f.close()
I rób, co chcesz z treścią „s”
źródło
contents = open(filename)
To daje generator, więc musisz gdzieś zapisać wartości, lub
contents = [line for line in open(filename)]
To sprawia, że zapisanie na liście jawnie zamknij nie jest wtedy możliwe (przynajmniej przy mojej znajomości Pythona).
źródło
with
robi). Nie może, ponieważ po zakończeniu iteracji nadal można wyszukać plik i ponownie rozpocząć czytanie, co nie zadziała, jeśli iteracja zamknie plik.