0%

📁 Failu darbs

Python padara failu lasīšanu un rakstīšanu vienkāršu. Iepazīsimies ar open(), with konteksta pārvaldnieku, kā arī ar CSV un JSON formātiem un mūsdienīgo pathlib.

python

open() un failu atvēršana

Teksts
# open(ceļš, režīms, encoding)
# Režīmi:
#   "r"  – lasīšana (noklusējums)
#   "w"  – rakstīšana (izdzēš saturu!)
#   "a"  – pielikšana (append)
#   "x"  – izveide (kļūda, ja jau eksistē)
#   "rb" – lasīšana bināri (attēli, PDF utt.)
#   "r+" – lasīšana + rakstīšana

# IETEICAMAIS veids: with konteksta pārvaldnieks
# Fails tiek automātiski aizvērts, pat ja notiek kļūda

# Rakstīt failu
with open("sveiciens.txt", "w", encoding="utf-8") as f:
    f.write("Sveika, pasaule!\n")
    f.write("Šī ir otrā rinda.\n")

# Lasīt visu failu
with open("sveiciens.txt", "r", encoding="utf-8") as f:
    saturs = f.read()
    print(saturs)

# Lasīt rindas kā sarakstu
with open("sveiciens.txt", "r", encoding="utf-8") as f:
    rindas = f.readlines()
    print(rindas)   # ["Sveika, pasaule!\n", "Šī ir otrā rinda.\n"]

# Lasīt rinda pēc rindas (optimāli lieliem failiem)
with open("sveiciens.txt", "r", encoding="utf-8") as f:
    for rinda in f:
        print(rinda.strip())   # .strip() noņem "\n"

# Pievienot saturam (neizdzēšot)
with open("sveiciens.txt", "a", encoding="utf-8") as f:
    f.write("Trešā rinda!\n")

CSV faili

Teksts
import csv

# Rakstīt CSV
studenti = [
    ["Vārds", "Vecums", "Pilsēta"],
    ["Anna", 22, "Rīga"],
    ["Jānis", 25, "Valmiera"],
    ["Kārlis", 21, "Liepāja"],
]

with open("studenti.csv", "w", newline="", encoding="utf-8") as f:
    rakstītājs = csv.writer(f)
    rakstītājs.writerows(studenti)

# Lasīt CSV
with open("studenti.csv", "r", encoding="utf-8") as f:
    lasītājs = csv.reader(f)
    for rinda in lasītājs:
        print(rinda)
# ["Vārds", "Vecums", "Pilsēta"]
# ["Anna", "22", "Rīga"]
# ...

# DictReader – rindas kā vārdnīcas
with open("studenti.csv", "r", encoding="utf-8") as f:
    lasītājs = csv.DictReader(f)
    for rinda in lasītājs:
        print(rinda["Vārds"], rinda["Pilsēta"])

# DictWriter – rakstīt no vārdnīcām
dati = [
    {"produkts": "Āboli", "cena": 1.99},
    {"produkts": "Bumbieri", "cena": 2.49},
]

with open("produkti.csv", "w", newline="", encoding="utf-8") as f:
    lauki = ["produkts", "cena"]
    rakstītājs = csv.DictWriter(f, fieldnames=lauki)
    rakstītājs.writeheader()
    rakstītājs.writerows(dati)

JSON faili

Teksts
import json

# Python objekts → JSON virkne (dumps)
dati = {
    "vārds": "Anna",
    "vecums": 25,
    "hobiji": ["lasīšana", "ceļošana"],
    "aktīvs": True,
    "bērni": None
}

json_virkne = json.dumps(dati, ensure_ascii=False, indent=2)
print(json_virkne)
# {
#   "vārds": "Anna",
#   "vecums": 25,
#   ...
# }

# JSON virkne → Python objekts (loads)
txt = '{"vārds": "Jānis", "vecums": 30}'
objekts = json.loads(txt)
print(objekts["vārds"])   # Jānis

# Saglabāt JSON failā (dump)
with open("dati.json", "w", encoding="utf-8") as f:
    json.dump(dati, f, ensure_ascii=False, indent=2)

# Nolasīt no JSON faila (load)
with open("dati.json", "r", encoding="utf-8") as f:
    ielasīts = json.load(f)

print(ielasīts["hobiji"])   # ["lasīšana", "ceļošana"]

# Custom objekti – JSON encoder
from datetime import datetime

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

dati_ar_laiku = {"nosaukums": "Pasākums", "laiks": datetime.now()}
print(json.dumps(dati_ar_laiku, cls=DateTimeEncoder))

pathlib – mūsdienīga failu navigācija

💡 pathlib vs os.path

Izmanto pathlib jaunajos projektos – tā ir modernāka, lasāmāka un darbojas vienādi uz Windows un Unix. os.path joprojām darbojas, bet pathlib ir ieteicamais variants.

Teksts
from pathlib import Path

# Ceļa izveide
cwd = Path.cwd()          # Pašreizējais direktorijs
mājas = Path.home()       # Mājas direktorijs
p = Path("mapes/apakšmape/fails.txt")

# Navigācija ar /
projekts = Path("/projekts")
konfigurācija = projekts / "config" / "settings.json"
print(konfigurācija)   # /projekts/config/settings.json

# Informācija par ceļu
p = Path("docs/readme.txt")
print(p.name)       # readme.txt
print(p.stem)       # readme
print(p.suffix)     # .txt
print(p.parent)     # docs

# Pārbaudes
print(p.exists())       # True/False
print(p.is_file())      # True, ja fails
print(p.is_dir())       # True, ja mape

# Direktorija saturs
source = Path(".")
for fails in source.iterdir():
    print(fails)

# Rekursīva meklēšana
for php_fails in source.rglob("*.php"):
    print(php_fails)

# Failu darbības
p.touch()                          # Izveidot tukšu failu
p.write_text("Saturs\n", encoding="utf-8")  # Uzrakstīt
saturs = p.read_text(encoding="utf-8")      # Nolasīt

jauns_nosaukums = p.with_name("jaunais.txt")
jauns_sufikss = p.with_suffix(".md")

mape = Path("jauna_mape")
mape.mkdir(exist_ok=True)          # Izveidot mapi
mape.mkdir(parents=True, exist_ok=True)  # Ar vecāku mapēm