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.