Zapisywanie do pliku w Pythonie

W wielu zadaniach, a szczególnie na maturze z informatyki, wyniki pracy trzeba zapisać do pliku tekstowego. Często musi on mieć odpowiednią nazwę, a dane wewnątrz niego muszą być podane w określony sposób. Jest to bardzo proste, ale są tu też pewne kruczki. W tym wpisie pokażę jak poprawnie wykonać zapisywanie do pliku w Pythonie do dokumentu tekstowego. Zachęcam też do przeczytania innego wpisu na tej stronie, w którym pokazuję jak wczytywać zawartość pliku tekstowego do skryptu Pythona.

Przygotowanie danych do zapisu

Żeby zapisywać zestaw danych do pliku, trzeba najpierw te dane mieć. Ja zapisywanie do pliku zaprezentuję na liście, którą przedstawiam poniżej. Zachęcam do jej skopiowania i wklejenia do w swoim pliku przeznaczonym do testowania.

1
2
3
4
5
6
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

Zapisanie jednej linijki

Rozpatrzymy prosty przypadek, w którym spróbujemy zapisać listę x do pliku tekstowego. Użyjemy do tego metody pliku o nazwie .write(string). Służy ona do zapisania pojedynczego stringa do pliku.

1
2
3
4
5
6
7
8
9
10
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

plik = open('wynik.txt', 'w')
plik.write(x[0])
plik.close()

Powyższy kod utworzy plik wynik.txt, jeśli takiego nie będzie, a następnie zapisze do niego pierwszy element listy x, czyli string "ala".

Warto pamiętać, że kolejne linijki możemy dopisywać w dowolnym momencie trwania programu i nie zostaną one nadpisane. Dopiero po zamknięciu pliku metodą .close() i ponownej próbie zapisu cała zawartość zostanie wymazana i zacznie być nadpisywana.

Zapis dwóch linijek w pliku

Zobaczmy jak zadziała poniższy skrypt

1
2
3
4
5
6
7
8
9
10
11
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

plik = open('wynik.txt', 'w')
plik.write(x[0])
plik.write(x[1])
plik.close()

Po jego uruchomieniu, w pliku wynik.txt pojawi się zarówno wyraz "ala" oraz "beata", jednak nie będą one zapisane w osobnych linijkach. Python zwyczajnie dołączy do poprzedniego stringa nowy stosując zwykłe dodawanie. Żeby uzyskać zapis tych dwóch stringów w osobnych linijkach pliku, należy dodać na ich końcach znaki ucieczki "\n", które oznaczają łamanie linii. Tam gdzie interpreter wykryje znak ucieczki, zostanie wstawiony w pliku “Enter”.

1
2
3
4
5
6
7
8
9
10
11
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

plik = open('wynik.txt', 'w')
plik.write(x[0] + "\n")
plik.write(x[1])
plik.close()

Zapisywanie listy do pliku w Pythonie

Do zapisania całej listy w Pythonie moglibyśmy użyć pętli for, która przechodząc przez listę doda po kolei każdy element listy x. Istnieje jednak prostszy sposób na tę czynność i jest to metoda .writelines(lista). Możemy zatem użyć kodu

1
2
3
4
5
6
7
8
9
10
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

plik = open('wynik.txt', 'w')
plik.writelines(x)
plik.close()

Gdy zajrzymy do pliku wynik.txt na pewno rzuci nam się w oczy to, że wszystko zostało zapisane w jednej linijce. Podobnie jak to miało miejsce wcześniej. Tu też potrzebujemy użyć znaków ucieczki "\n". Musimy w tym celu przekształcić listę x w taki sposób, by każdy element kończył się “Enterem”. Stworzymy do tego celu nową listę x_new,

1
2
3
4
5
6
7
8
9
10
11
12
x = ["ala", "beata", "cecylia", "dorota",
    "ewa", "franciszka", "gracja", "halina",
    "irena", "jadwiga", "klaudia", "lidia",
    "monika", "natalia", "olga", "pola",
    "ryszarda", "sonia", "tania", "urszula",
    "wanda", "zenobia"]

plik = open('wynik.txt', 'w')
x_nowe = []
for i in x: x_nowe.append(i + '\n')
plik.writelines(x_nowe)
plik.close()

A oto efekt:

Plik z zapisaną zawartością listy

Więcej?

To oczywiście nie wyczerpuje tematu zapisywania danych do plików tekstowych, jednak jest dobrym wstępem. Zachęcam do poczytania dokumentacji języka, by dowiedzieć się więcej o możliwych opcjach zapisu.