Czytanie plików w Pythonie

Wprowadzenie

Aby pracować z przechowywanymi danymi, obsługa plików staje się podstawową wiedzą każdego profesjonalnego programisty Pythona. Od najwcześniejszego wydania zarówno odczytywanie, jak i zapisywanie danych do plików są wbudowanymi funkcjami Pythona. W porównaniu do innych języków programowania, takich jak C czy Java, jest dość prosty i wymaga tylko kilku linijek kodu. Co więcej, nie trzeba ładować żadnego dodatkowego modułu, aby zrobić to poprawnie.

W tym artykule wyjaśnimy, jak czytać pliki w Pythonie na przykładach. Niektóre przykłady obejmują odczytywanie pliku wiersz po wierszu, jako fragment (określona liczba wierszy na raz) i odczytywanie pliku za jednym razem. Ponadto pokażemy Ci sposób na odczytanie tylko określonej linii z pliku, bez przeszukiwania całego pliku.

Podstawy plików w Pythonie

Typowe metody pracy z plikami to: open() otworzyć plik, seek() aby ustawić bieżącą pozycję pliku pod podanym offsetem, i close() aby zamknąć obiekt pliku, gdy skończysz go używać. Wbudowany open() funkcja zwraca uchwyt pliku, który reprezentuje obiekt pliku, który ma być używany w celu uzyskania dostępu do pliku w celu odczytu, zapisu lub dołączenia.

Otwierając plik do odczytu, Python musi dokładnie wiedzieć, jak plik powinien zostać otwarty w systemie. Dostępne są dwa tryby dostępu – odczyt i odczyt w trybie binarnym. Odpowiednie używane flagi to 'r', 'rb'i muszą być określone podczas otwierania pliku za pomocą wbudowanego open() funkcjonować. Pierwszy tryb obejmuje interpretację znaków specjalnych, takich jak „CR” (powrót karetki) i „LF” (wysuw wiersza) do reprezentowania łamania wiersza, natomiast tryb binarny umożliwia odczytywanie danych w trybie surowym – gdzie dane są przechowywane bez zmian. bez dalszej interpretacji.

Po otwarciu pliku open() funkcja zwróci Ci obiekt pliku. Te obiekty plików mają metody takie jak read(), readline(), write(), tell(), seek(). Chociaż niektóre obiekty plików (lub obiekty podobne do plików) mają więcej metod niż te wymienione tutaj, są one najbardziej powszechne. Nie wszystkie obiekty plików muszą implementować wszystkie metody plików.

Czytanie pliku wiersz po wierszu

Pierwszy przykład inspirowany jest dwoma językami programowania – C i C++. Jest to chyba najbardziej intuicyjne podejście – otwórz plik za pomocą open() funkcjonować, przeczytaj plik linia po linii używając readline() metody i wypisz wiersz natychmiast po odczytaniu.

W użyciu tutaj jest while pętla, która nieprzerwanie czyta z pliku tak długo, jak readline() Metoda stale zwraca dane. W przypadku osiągnięcia końca pliku (EOF) while pętla zatrzymuje się, a obiekt pliku jest zamykany, zwalniając zasoby, z których mogą korzystać inne programy:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Jak mogłeś zauważyć, w tym przykładzie jawnie otworzyliśmy i zamknęliśmy plik. Chociaż interpreter Pythona automatycznie zamyka otwarte pliki pod koniec wykonywania programu Python, jawnie zamyka plik poprzez close() jest dobrym stylem programowania i nie należy o tym zapominać.

Jako ulepszenie, wygodny protokół iteratora został wprowadzony w Pythonie 2.3. Pozwala to uprościć readline pętla:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

W użyciu tutaj jest for pętla w połączeniu z in iterator. Obecna linia jest identyfikowana za pomocą in iterator, odczytywany z pliku, a jego zawartość jest wyprowadzana do stdout. Python obejmuje otwieranie i zamykanie pliku, gdy wykracza on poza zakres. Chociaż jest to nieefektywne, pozwala to nie mieć już do czynienia z uchwytami plików.

Niestety, powyższy kod jest mniej jednoznaczny i opiera się na wewnętrznym wyrzucaniu śmieci Pythona do obsługi zamykania pliku.

Wprowadzony w Pythonie 2.5, with Polecenie jeszcze bardziej hermetyzuje cały proces, a także obsługuje otwieranie i zamykanie plików tylko raz w całym bloku kodu z określonym zakresem:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

Połączenie with oświadczenie i open() polecenie otwiera plik tylko raz. Jeśli się powiedzie, for wykonywana jest pętla, a treść linii jest drukowana stdout.

Ponadto użycie with oświadczenie ma efekt uboczny. Wewnętrznie interpreter Pythona tworzy try-finally-block do hermetyzacji odczytu z pliku. Poniższy przykład pokazuje, co zasadniczo dzieje się wewnętrznie w Pythonie z with bloki kodu:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Czytanie pliku jako kawałków linii

Do tej pory przetwarzaliśmy plik linia po linii. Jest to dość powolne w przypadku dużych plików i można je poprawić, czytając wiele wierszy jednocześnie. Aby to osiągnąć, islice() metoda z itertools w grę wchodzi moduł. Działa również jako iterator i zwraca porcję danych, która składa się z n linie. Na końcu pliku wynik może być krótszy, a na końcu wywołanie zwróci pustą listę:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

Odczytywanie określonej linii z pliku

Korzystając z przedstawionych powyżej metod, możemy również wykonać inne przydatne czynności, takie jak odczytanie określonej linii z pliku. Aby to zrobić, korzystamy z licznika i wypisujemy odpowiednią linię, gdy dojdziemy do niego podczas iteracji pliku:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Powinno to być łatwe do zrozumienia, ale jest nieco dłuższe niż w poprzednich przykładach. Można go skrócić za pomocą pamięć podręczna moduł.

Poniższy przykład pokazuje, jak uprościć kod za pomocą getline() metoda. Jeśli żądany numer wiersza wykracza poza zakres poprawnych wierszy w pliku, wówczas getline() metoda zamiast tego zwraca pusty ciąg:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Czytanie całego pliku na raz

Na koniec przyjrzymy się zupełnie innej sprawie niż poprzedni przykład – odczytanie całego pliku za jednym razem.

Pamiętaj, że w większości przypadków powinieneś mieć wystarczająco dużo pamięci, aby odczytać cały plik, ponieważ znaki nie zajmują zbyt dużo miejsca, ale uważaj na duże pliki. W poniższym przykładzie użyto kombinacji with oświadczenie, a read() metoda. W tym przypadku użyjemy read() aby załadować zawartość pliku jako strumień danych:

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python oferuje również readlines() metoda, która jest podobna do readline() metoda z pierwszego przykładu. W odróżnieniu read(), zawartość pliku jest przechowywana na liście, gdzie każdy wiersz zawartości jest elementem:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Kompletujemy wszystkie dokumenty (wymagana jest kopia paszportu i XNUMX zdjęcia) potrzebne do readlines() będzie czytać treść z pliku, dopóki nie osiągnie EOF, pamiętaj, że możesz również ograniczyć ilość czytanej treści, podając sizehint parametr, który jest liczbą bajtów do odczytania.

Wnioski

Jak zwykle, istnieje więcej niż jeden sposób na odczytanie zawartości pliku. Pod względem szybkości wszystkie należą mniej więcej do tej samej kategorii. To, które rozwiązanie działa najlepiej, zależy od konkretnego przypadku użycia. Uważamy, że bardzo pomocne jest sprawdzenie, co jest możliwe, a następnie wybranie najlepszego rozwiązania.

Chociaż Python znacznie upraszcza proces odczytywania plików, czasami może to być trudne, w takim przypadku polecam przyjrzeć się oficjalna dokumentacja Pythona więcej informacji.

Znak czasu:

Więcej z Nadużycie stosu