Rozdział 15 · Python i akta

Zapis do plików: write() i tryby r/w/a/x

Każdy tryb otwarcia to świadomy wybór, a nie szczegół składni.

write() sam nie dodaje linii

write_bez_n.py
with open("log.txt", "w", encoding="utf-8") as f:
    f.write("Hello")
    f.write("World")
Nagranie
f.write("Hello")
f.write("World")
Na dysku
HelloWorld
write() nie wstawia \n samego — jeśli potrzebujesz podziału linijki, zapisz go wyraźnie: f.write(„Hello\n”

Tryby otwarcia - Przegląd

Cztery podstawowe tryby
open(path, „r”
Odczyt.
Błąd, jeśli plik nie istnieje.
open(path, „w”
Zapis.
Tworzy nowy plik lub czyści istniejący
JUŻ PRZY OTWIERANIU.
open(ścieżka, „a”
Dodatkowe nagranie na końcu.
Tworzy plik, jeśli go nie ma.
open(path, „x”
Tworzy nowy plik.
FileExistsError jeśli plik już istnieje.
Następnie dodane są t/b/+ modyfikatory (od sekcji 15.17).
Debug Lab 5: „w”
perezapis.py
#rezultaty.txt już zawiera ważne wyniki z poprzedniej gry
with open("rezultaty.txt", "w", encoding="utf-8") as f:
    pass   # nawet nic nie nagrałem
(файл rezultaty.txt теперь пуст)
Co widać na ekranie

Plik stał się pusty, mimo że nie zapisaliśmy nic wewnątrz bloku. Otwieranie w trybie "w" kasuje wcześniejszą zawartość w momencie otwarcia, i to nie w momencie pierwszego write().

Poprawiony kod
dozapis_vmesto_w.py
# Jeśli celem jest dodawanie, a nie zastępowanie, potrzebujesz trybu "a", a nie "w"
with open("rezultaty.txt", "a", encoding="utf-8") as f:
    f.write(„Nowy wynik\n”)

Tryb „x”

rezhim_x.py
try:
    with open("save.json", "x", encoding="utf-8") as f:
        f.write("{}")
except FileExistsError:
    print(„Plik zapisu już istnieje – nie nadpisuj go przypadkiem”)
x - Ochrona przed przypadkowym nadpisaniem
Jeśli ważne jest, aby nie nadpisać istniejącego pliku przez pomyłkę – "x" będzie to wyraźnie komunikować za pomocą FileExistsError, zamiast cichego nadpisywania, które zrobiłby tryb "w".
Debug Lab 6: writelines() nie dodaje przerw między liniami
writelines_lovushka.py
stroki = ["Anna", "Bob", "Carlos"]
with open("igroki.txt", "w", encoding="utf-8") as f:
    f.writelines(stroki)
(файл igroki.txt содержит одну строку: AnnaBobCarlos)
Co widać na ekranie

Oczekiwano trzech linii, ale okazało się, że była to jedna połączona łańcuch znaków. writelines() — mimo nazwy — nie dodaje sama nowych liniipo prostu zapisuje elementy pojedynczo. Jeśli potrzebne są oddzielne linie, przewod linii musi być uwzględniony w każdym elemencie wcześniej.

Poprawiony kod
writelines_fixed.py
stroki = ["Anna", "Bob", "Carlos"]
with open("igroki.txt", "w", encoding="utf-8") as f:
    f.writelines(s + "\n" for s in stroki)

Trochę głębiej: Modyfikatory +

r+, w+, a+ od razu otworzyć plik do czytania i zapisu — ale podstawowa semantyka Obcinaj/nadpisuj każdy tryb (w myje, a dodaje na końcu) nadal obowiązuje tutaj. Jest to opcjonalne Materiał – Podstawowy r/w/a/x wystarczające dla większości programów.

Praktyka: Tryby write() i r/w/a/x
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →