Operacje wejścia/wyjścia - Pliki¶
Otwarcie/Zamknięcie pliku¶
Otwarcie pliku realizowane jest za pomocą funkcji open()
przyjmującej dwa argumenty - nazwę pliku i tryb otwarcia, funkcja ta zwraca obiekt, który pozwala na wykonanie podstawowych operacji na pliku.
Zamknięcie pliku jest realizowane poprzez wywołanie funkcji close()
na zwróconym obiekcie.
fp = open("tmp.txt", "w")
# pozostałe instrukcje programu
# wymagane zamknięcie pliku
fp.close()
Tryb otwarcia pliku określa sposób, w jaki plik będzie używany. Możliwymi trybami są:
r
- plik będzie tylko odczytywany,r+
- dane z/do pliku będą odczytywane i zapisywane,w
- dane do pliku będą zapisywane (jeśli plik istnieje jego zawartość zostanie usunięta,a
- dane do pliku będą dopisywane (jeśli plik istnieje jego zawartość nie zostanie usunięta).
W przypadku dopisania do trybu litery b
, plik zostanie otwarty w trybie binarnym.
Jakie problemy istnieją w powyższym rozwiązaniu?
Problem: Co się stanie jeśli zapomnimy wywołać funkcji close()?
Konstrukcja with¶
Specjalna konstrukcja with automatycznie zamyka plik po zakończeniu wykonywania bloku kodu.
with open("tmp.txt", "w") as fp:
# kod operujący na pliku
pass
# w tym miejscu plik jest zamknięty
Odczyt/Zapis danych¶
Wczytanie całego pliku do zmiennej można uzyskać poprzez wywołanie funkcji read()
na obiekcie reprezentującym plik.
with open("tmp.txt") as fp:
text = fp.read()
print("Zawartość pliku:", text)
Nazwa text
będzie wskazywała na napis w postaci ciągu znaków (string).
Odczytanie pojedynczej linii z pliku możliwe jest za pomocą funkcji readline()
. W przypadku napotkania na koniec pliku funkcja zwraca pusty napis.
# odczytanie zawartości pliku linia po linii
with open("tmp.txt") as fp:
line = fp.readline()
while line != '':
print("Linia z pliku: ", line)
line = fp.readline()
Odczytanie kolejnych linii z pliku może być zrealizowane za pomocą pętli for
.
# odczytanie zawartości pliku linia po linii
with open("tmp.txt") as fp:
for line in fp:
print("Linia z pliku: ", line)
Za pomocą konstruktora list()
oraz funkcji readlines()
można wczytać wszystkie linie z pliku do listy.
with open("tmp.txt") as fp:
lines = list(fp)
print(lines)
with open("tmp.txt") as fp:
lines = fp.readlines()
print(lines)
Dane odczytane z pliku otwartego w trybie binarnym zwracane są w postaci ciągu bajtów, by zamienić je na ciąg znaków (string) muszą zostać zdekodowane.
bytes.decode(encoding="utf-8", errors="strict")
bytearray.decode(encoding="utf-8", errors="strict")
Return a string decoded from the given bytes. Default encoding is «utf-8». errors may be given to set a different error handling scheme. The default for errors is «strict», meaning that encoding errors raise a UnicodeError. Other possible values are «ignore», «replace» and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings. 1
Zapisanie ciągu znaków do pliku odbywa się za pomocą funkcji write()
wywoływanej na obiekcie reprezentującym plik.
with open("tmp.txt", "w") as fp:
fp.write("plik testowy\nwieloliniowy")
Dane zapisywane do pliku otwartego w trybie binarnym muszą być w postaci ciągu bajtów, by zamienić ciąg znaków (string) na ciąg bajtów należy napis zakodować.
str.encode(encoding="utf-8", errors="strict")
Return an encoded version of the string as a bytes object. Default encoding is «utf-8». errors may be given to set a different error handling scheme. The default for errors is «strict», meaning that encoding errors raise a UnicodeError. Other possible values are «ignore», «replace», «xmlcharrefreplace», «backslashreplace» and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings. 1