Jak obsługiwać pliki w Pythonie

W każdym języku programowania kluczową kwestią jest interakcja z plikami. Python oferuje rozbudowane możliwości w tym zakresie, umożliwiając pracę z plikami w różnych trybach, takich jak odczyt, zapis i inne operacje.

Po lekturze tego artykułu zdobędziesz umiejętności w zakresie:

  • otwierania i przeglądania zawartości plików w Pythonie,
  • odczytywania poszczególnych wierszy z pliku tekstowego,
  • dodawania i zapisywania danych do plików, a także
  • efektywnego korzystania z menedżerów kontekstu podczas pracy z plikami.

Sposoby na odczyt pliku w Pythonie

Aby otworzyć plik w Pythonie, wykorzystuje się funkcję o ogólnej strukturze: `open(’nazwa_pliku’, 'tryb’)`.

  • Argument `nazwa_pliku` oznacza nazwę pliku, który chcemy otworzyć.

Ważne: Jeżeli plik, z którym zamierzamy pracować, znajduje się w aktualnym katalogu roboczym, wystarczy podać tylko jego nazwę. W przypadku, gdy plik umiejscowiony jest w innym folderze, konieczne będzie podanie pełnej ścieżki dostępu.

  • Parametr `tryb` definiuje sposób otwarcia pliku.

Domyślnym trybem otwierania pliku jest tryb odczytu, oznaczany literą `’r’`. Zaleca się jednak, aby zawsze jawnie określać tryb otwarcia.

Przed przystąpieniem do dalszych działań, spójrzmy na zawartość pliku `lib.txt`, który posłuży nam jako przykład.

📁 Pobierz plik tekstowy oraz kod użyty w tym opracowaniu z tego repozytorium GitHub.

Poniższy fragment kodu przedstawia, jak otworzyć plik tekstowy `lib.txt` za pomocą funkcji `open()` i odczytać jego zawartość:

file = open('lib.txt','r')
contents = file.read()
print(contents)
file.close()

# Output
Hello, there!
Here are a few helpful Python libraries:
1) NumPy
2) pandas
3) matplotlib
4) seaborn
5) scikit-learn
6) BeautifulSoup
7) Scrapy
8) nltk
9) Bokeh
10) statsmodels

Analiza powyższego przykładu:

  • Funkcja `open()` zwraca obiekt reprezentujący plik, który w naszym przypadku nazwaliśmy `file`.
  • Następnie wywołujemy metodę `read()` na tym obiekcie.
  • Zmienna `contents` przechowuje teraz pełną zawartość pliku, którą następnie wyświetlamy.
  • Na koniec zamykamy plik za pomocą metody `close()`.

Należy pamiętać, że zapominanie o zamykaniu plików może prowadzić do niepotrzebnego zużycia zasobów. Szczególnie przy pracy z dużą ilością plików, może to mieć negatywny wpływ na zużycie pamięci, ponieważ pliki pozostają otwarte, mimo że nie są już używane.

Teraz przyjrzymy się bardziej efektywnemu sposobowi pracy z plikami, z wykorzystaniem menedżerów kontekstu. Poniższy kod pokazuje, jak można ich użyć.

with open('lib.txt','r') as f:
  contents = f.read()
  print(contents)

Korzystając z menedżerów kontekstu, nie musimy ręcznie zamykać plików za pomocą metody `close()`. Pliki zostają automatycznie zamknięte po zakończeniu wykonywania operacji wejścia/wyjścia.

Jak odczytywać wiersze z pliku w Pythonie?

W naszym przykładowym pliku tekstowym mieliśmy tylko kilka wierszy. Wczytanie całej zawartości pliku na raz nie było zatem problematyczne.

Jednakże, w przypadku pracy z dużymi plikami, wykorzystanie metody `read()` może okazać się niewydajne.

W sytuacji, gdy plik tekstowy jest bardzo duży, próba wczytania go w całości może szybko doprowadzić do wyczerpania pamięci. Z tego powodu, w wielu przypadkach bardziej korzystne jest odczytywanie pliku wiersz po wierszu. W tej sekcji nauczymy się, jak to robić.

Użycie metody `readline()` do odczytywania wierszy z pliku

Metoda `readline()` umożliwia odczytanie z pliku jednego wiersza na raz.

Przeanalizujmy poniższy fragment kodu:

with open('lib.txt','r') as f:
  line = f.readline()
  print(line)
  line = f.readline()
  print(line)

# Output
Hello, there!

Here are a few helpful Python libraries:

Jak widać, pierwsze wywołanie metody `readline()` powoduje wyświetlenie pierwszego wiersza z pliku. Drugie wywołanie metody `readline()` zwraca drugi wiersz.

Dzieje się tak, ponieważ po pierwszym wywołaniu metody, wskaźnik pliku zostaje ustawiony na początku drugiego wiersza.

W Pythonie, aktualną pozycję wskaźnika pliku można sprawdzić za pomocą metody `tell()`. Do przemieszczania wskaźnika pliku do określonej lokalizacji służy metoda `seek()`.

W poniższym fragmencie kodu używamy `f.seek(0)` po pierwszym wywołaniu metody. Przenosi to wskaźnik pliku na początek pliku tekstowego. W efekcie, za każdym razem drukowany jest pierwszy wiersz pliku.

with open('lib.txt','r') as f:
  line = f.readline()
  print(line)
  f.seek(0)
  line = f.readline()
  print(line)

# Output
Hello, there!

Hello, there!

Użycie metody `readlines()` do odczytywania wierszy z pliku

Istnieje również metoda `readlines()`, która jest ściśle powiązana z `readline()`.

Po uruchomieniu poniższego kodu, zauważymy, że metoda `readlines()` zwraca listę zawierającą wszystkie wiersze pliku.

with open('lib.txt','r') as f:
  lines = f.readlines()
  print(lines)

# Output
['Hello, there!n', 'Here are a few helpful Python libraries:n', '1) NumPyn', '2) pandasn', '3) matplotlibn', '4) seabornn', '5) scikit-learnn', '6) BeautifulSoupn', '7) Scrapyn', '8) nltkn', '9) Bokehn', '10) statsmodelsn', 'n']

Wykorzystanie pętli `for` do odczytywania wierszy z pliku

Wczytywanie wierszy z pliku tekstowego można również zrealizować za pomocą pętli `for`.

Po utworzeniu obiektu reprezentującego plik, można użyć pętli `for` do iteracji po jego zawartości – jeden wiersz na raz i wyświetlania ich, jak pokazano poniżej. Warto zauważyć, że uzyskujemy dostęp tylko do pojedynczych wierszy, bez wczytywania całej zawartości pliku do pamięci.

with open('lib.txt','r') as f:
  for line in f:
    print(line, end='')

Uwaga: W przypadku korzystania z funkcji `print()`, domyślnym separatorem jest znak nowej linii `\n`. W oryginalnym pliku nie mamy tych znaków. Dlatego ustawiamy parametr separatora na pusty ciąg: `end = ”`, aby wyświetlić zawartość pliku w niezmienionej formie.

Odczytywanie fragmentów treści z pliku

W Pythonie istnieje możliwość odczytywania zawartości pliku w mniejszych fragmentach.

Przeanalizujmy poniższy kod:

  • W tym przypadku ustawiamy `chunk_size` na 50. Oznacza to, że zostanie wczytanych pierwszych 50 znaków pliku i zostaną one wyświetlone.
  • Następnie wywołujemy metodę `tell()` na obiekcie pliku `f`. Zauważymy, że wskaźnik pliku znajduje się teraz na pozycji 51, co jest zgodne z naszymi oczekiwaniami.
chunk_size = 50
with open('lib.txt','r') as f:
  chunk = f.read(chunk_size)
  print(chunk)
  current = f.tell()
  print(f"Current position of file pointer: {current}")

# Output
Hello, there!
Here are a few helpful Python librar
Current position of file pointer: 51

Możemy również wykorzystać tę technikę do odczytania całego pliku w mniejszych fragmentach.

Poniższy fragment kodu prezentuje, jak to zrobić:

chunk_size = 50
with open('lib.txt','r') as f:
  chunk = f.read(chunk_size)
  print(chunk,end='')

  while(len(chunk)>0):
    chunk = f.read(chunk_size)
    print(chunk,end='')

# Output
Hello, there!
Here are a few helpful Python libraries:
1) NumPy
2) pandas
3) matplotlib
4) seaborn
5) scikit-learn
6) BeautifulSoup
7) Scrapy
8) nltk
9) Bokeh
10) statsmodels

W tym przypadku, korzystamy z pętli `while` do odczytywania zawartości pliku. Odczytujemy plik w fragmentach o rozmiarze 50 znaków, aż do momentu, gdy dotrzemy do jego końca.

Zapisywanie do pliku w Pythonie

Aby zapisać dane do pliku tekstowego w Pythonie, należy otworzyć go w trybie zapisu, poprzez określenie trybu `’w’`.

Poniższy fragment kodu pokazuje, jak to zrobić:

with open('new_file.txt','w') as f:
  f.write('Hello, Python!')

Po wykonaniu powyższego kodu, w bieżącym katalogu roboczym zostanie utworzony plik `new_file.txt`.

Teraz uruchommy ponownie powyższy blok kodu.

Następnie w terminalu wykonajmy następujące polecenie:

cat new_file.txt

# Output: Hello, Python!

W teorii, zapisaliśmy do pliku dwa razy. Czyli fraza „Hello, Python!” powinna zostać wyświetlona dwukrotnie, prawda?

Jednak zauważymy, że została wyświetlona tylko raz. Dzieje się tak, ponieważ otwierając plik w trybie zapisu `(w)`, zasadniczo nadpisujemy całą jego dotychczasową zawartość.

Jeśli chcemy dodać treść na końcu pliku, bez nadpisywania istniejących danych, należy otworzyć plik w trybie dopisywania. Sprawdzimy, jak to zrobić w kolejnej sekcji.

Dopisywanie do pliku w Pythonie

Aby dodać treść do pliku, bez usuwania jego istniejącej zawartości, należy otworzyć go w trybie dopisywania.

W tym celu użyjemy trybu `’a’`, gdzie `a` oznacza „append” (dopisywanie) i jawnie go określimy.

Następnie, uruchommy dwukrotnie poniższy kod:

with open('new_file.txt','a') as f:
  f.write('Hello, Python!')

Zauważymy, że tekst jest teraz wyświetlany dwukrotnie, ponieważ został dodany do pliku.

cat new_file.txt

# Output: Hello, Python!Hello, Python!

Podsumowanie

Podsumujmy pokrótce, co omówiliśmy w tym artykule.

  • Poznaliśmy podstawowe operacje wejścia/wyjścia związane z plikami, takie jak odczytywanie, zapisywanie i dopisywanie danych.
  • Dowiedzieliśmy się, jak używać metody `seek()` do przemieszczania wskaźnika pliku do konkretnej pozycji i
  • jak wykorzystać metodę `tell()` do odczytania aktualnej pozycji wskaźnika pliku.

Mam nadzieję, że ten artykuł był dla Ciebie przydatny. Teraz, gdy już wiesz, jak pracować z plikami tekstowymi w Pythonie, możesz dowiedzieć się, jak korzystać z plików JSON w Pythonie.

Powiązane:

Sprawdź długość listy w Pythonie w 3 krokach.