Operacje we/wy na plikach

Stronę tą wyświetlono już: 322 razy

Otwieranie pliku

Jak to zazwyczaj bywa, aby wykonać jakąś operację odczytu czy też zapisu do pliku trzeba najpierw plik otworzyć. Do tego celu służy funkcja open. Oto przykład użycia tej funkcji:

Listing 1
  1. file = open("plik.txt", "w", -1, "utf-8")

Pierwszym argumentem jest oczywiście ścieżka do pliku, która może być względna lub bezwzględna. Drugi argument jest nieco ciekawszy i może przyjmować kilka różnych wariantów:

  • "w" - otwieranie tylko do zapisu;
  • "r" - otwieranie tylko do odczytu;
  • "x" - tworzy nowy plik i otwiera go do zapisu;
  • "a" - otwiera tylko do zapisu ustawiając miejsce zapisu na koniec pliku, tryb ten działa poprawnie jedynie gdy plik istnieje;
  • "b" - tryb zapisu / odczytu binarnego;
  • "t" - tryb zapisu / odczytu tekstowego (domyślny);
  • "+" - otwiera plik do odczytu i zapisu.

Kolejny parametr pominę, jest on związany z buforowaniem. Jego wartość może zostać ustawiona na 0 w celu wyłączenia buforowania (dopuszczalne jedynie w trybie binarnym). Domyślna wartość dla tego parametru jest -1, co oznacza że doborem rozmiaru bufora będzie się zajmowała metoda wewnętrzna uchwytu pliku pozyskanego za pomocą funkcji open.

Ostatni argument, którym ja się zainteresowałem to kodowanie naszego pliku. Domyślnie program użyłby kodowania systemowego a ten (jak sama nazwa wskazuje) zależy od ustawień systemu. Nie wiem jak wam, ale mi się to nie spodobało, dlatego też pokazałem jak można samemu wybrać sobie sposób kodowania w tym przypadku "utf-8".

Zapis danych do pliku

Otrzymany za pomocą funkcji open uchwyt pliku, można wykorzystać do zapisu danych (pod warunkiem, że plik został utworzony w odpowiednim trybie). Oto przykład zapisu do pliku danych za pomocą metody write:

Listing 2
  1. file.write("jakiś tam tekst")

Zamykanie pliku

Po zapisaniu tego, co miało zostać zapisane trzeba plik zamknąć, do czego służy oczywiście następująca metoda close:

Listing 3
  1. file.close()

Zapisywanie danych do pliku

O wiele ciekawszym procesem jest odczytywanie danych z pliku, co oczywiście wymaga odmiennego tryby otwierania tegoż pliku. Pierwszy przykład umożliwia odczytanie całego pliku w całości za pomocą metody read:

Listing 4
  1. file = open("plik.txt", "r", -1, "utf-8")
  2. print(file.read())
  3. file.close()

Metoda read może wczytywać określoną liczbę znaków, np. w taki oto sposób:

Listing 5
  1. file = open("plik.txt", "r", -1, "utf-8")
  2. print(file.read(2))
  3. file.close()

Powyższy kod wczyta jedynie dwa pierwsze znaki z pliku plik.txt.

Można też do tego samego problemu podejść nieco inaczej i wczytać tekst linijka po linijce:

Listing 6
  1. with open("plik.txt", "r", -1, "utf-8") as file:
  2. lines = file.readlines()
  3. for line in lines:
  4. print(line)

Warto zwrócić uwagę na fakt, że nie ma w powyższym kodzie miejsca dla metody close, czyżbym o niej zapomniał? Ależ skądże znowu, po prostu metoda ta nie jest w tym przypadku potrzebna, ponieważ po zakończeniu wypisywania danych z pliku ten zostanie automatycznie zamknięty.

Zmiana miejsca odczytu/zapisu w pliku

Otwórzmy nasz nieszczęsny plik do zapisu i odczytu oraz posłużmy się metodą seek w celu zmiany miejsca zapisu i odczytu danych pliku:

Listing 7
  1. file = open("plik.txt", "r+", -1, "utf-8") # otwieranie do odczytu i zapisu
  2. print(file.read())
  3. file.seek(0) # ustawienie puntu odczytu i zapisu na początek pliku
  4. file.write("Jakiś tam tekst do zapisu")
  5. file.seek(0)
  6. print(file.read())
  7. file.close()

Ustalanie bieżącego położenia w pliku

Bieżące położenie punktu zapisu lub odczytu danych pliku można pozyskać za pomocą metody tell:

Listing 8
  1. file = open("plik.txt", "r+", -1, "utf-8") # otwieranie do odczytu i zapisu
  2. print(file.tell())
  3. print(file.read())
  4. print(file.tell())
  5. file.seek(0) # ustawienie puntu odczytu i zapisu na początek pliku
  6. print(file.tell())
  7. file.write("Jakiś tam tekst do zapisu")
  8. print(file.tell())
  9. file.seek(0)
  10. print(file.tell())
  11. print(file.read())
  12. print(file.tell())
  13. file.close()

Komentarze