📁 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.
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