# dades que sobreviuen al programa

Fitxers en Python

El mateix concepte que a C — desar dades al disc i tornar-les a llegir — amb una sintaxi força més curta i sense haver de tancar res a mà.

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ètodeFa
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

NomValor

Fitxer

Terminal

Pas 1 / 1

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?