open() i with
Exemple
with open("notes.txt", "w") as f:
f.write("Jordi 16\n")
f.write("Anna 20\n")
print("Fitxer escrit")
Els modes són els mateixos que a C: "r" (lectura), "w" (escriptura, sobreescriu) i "a" (afegir al final). with és un gestor de context: tanca el fitxer tot sol en sortir del bloc indentat, encara que hi hagi un error pel mig — mai cal recordar-se de cap fclose.
Escriure i llegir
| Mètode | Fa |
|---|---|
f.write(text) | escriu text (sense afegir salt de línia sol) |
f.read() | llegeix tot el fitxer en una sola cadena |
f.readline() | llegeix només la línia següent |
f.readlines() | retorna una llista amb totes les línies |
Exemple
with open("notes.txt", "r") as f:
linia = f.readline()
nom, edat = linia.split()
edat = int(edat)
print(f"{nom} té {edat} anys")
linia.split() trenca la línia pels espais i en retorna una llista de trossos — com "%s %d" amb fscanf, però sense especificar cap format: tot arriba com a text, i converteixes el que calgui amb int().
Llegir línia a línia
A C calia comprovar si fgets retornava NULL dins d'un while. En Python, un fitxer obert ja és directament una seqüència de línies.
with open("notes.txt", "r") as f:
for linia in f:
print(linia, end="")
for linia in f: ja recorre totes les línies, una per una, fins que s'acaben — sense cap condició explícita de final de fitxer. end="" evita un doble salt de línia, ja que cada linia ja porta el seu propi \n al final.
bonus Si el fitxer no existeix
Obrir en mode "r" un fitxer que no existeix llança un FileNotFoundError — el mateix cas que a C donava un NULL, aquí es gestiona amb el try/except que ja coneixes.
try:
with open("notes.txt", "r") as f:
contingut = f.read()
except FileNotFoundError:
print("El fitxer no existeix")
Mira el fitxer omplir-se i buidar-se pas a pas
Fixa't que f.write() i f.read() no toquen mai el terminal: el panell "Fitxer" és on passa l'acció.
Escriptura i lectura
Línia a línia
Codi
Variables
| Nom | Valor |
|---|
Fitxer
Terminal
Problemes per resoldre
Sense solució ni comprovació automàtica: escriu l'script, executa'l (python3 programa.py) i prova'l. Les pistes són plegades perquè les obris només si les necessites.
1. Desar i sumar
Escriu un script que desi els números 3, 7, 1, 9 i 5 en un fitxer numeros.txt (un per línia). Després, torna'l a obrir, llegeix-los i mostra'n la suma.
Suma: 25
Pistes
Per escriure: for num in [3, 7, 1, 9, 5]: f.write(f"{num}\n").
Per llegir i sumar: sum(int(linia) for linia in f) — una sola línia, gràcies a poder recórrer el fitxer directament.
2. Comptar línies
Reaprofitant el numeros.txt de l'exercici anterior, escriu un script que compti quantes línies té.
El fitxer té 5 línies
Pistes
len(f.readlines()) ja te les compta totes d'un cop, sense cap bucle explícit.
3. Copiar un fitxer
Escriu un script que copiï el contingut de numeros.txt a un fitxer nou, copia.txt.
Copiat correctament
Pistes
Obre'ls amb dos with (o un de sol amb dues clàusules: with open(...) as origen, open(...) as desti:), llegeix tot el contingut amb origen.read() i escriu-lo amb desti.write(...).
A la pràctica, per copiar fitxers sencers sol fer-se servir directament shutil.copy("numeros.txt", "copia.txt") — però fer-ho a mà, com aquí, ajuda a entendre què hi ha per sota.
Exercicis d'autoavaluació
Aquests es generen amb valors nous a l'atzar i tenen solució comprovable.
Quina serà la sortida per terminal d'aquest programa?