Llegir i editar fitxers de text amb Python és molt senzill, fins i tot si venen comprimits. També veurem com controlar les possibles excepcions durant l'accés als fitxers.
- Conceptes previs.
- Rutes (Paths)
- Modes d’accés a fitxers.
- Mode read, r
- Mode append, a
- Mode write, w (sobreescriptura)
- Encoding
- Crear directoris
- Exercicis.
Llegir, crear i editar fitxers de text de tot tipus (text pla, binaris, CSV, JSON, HTML… ) amb Python és ràpid i molt senzill.
Conceptes previs.
En el seu nucli, un fitxer és un conjunt contigu de bytes utilitzats per emmagatzemar dades.
Aquestes dades s’organitzen en un format específic i poden ser qualsevol cosa tan simple com un fitxer de text o tan complexe com un paquet ofimàtic o un videojoc.
Nosaltres ens centrarem en el primer cas, fixers en format de text pla perquè són simples, transparents i fàcils de manipular: es poden llegir amb qualsevol editor, processar amb scripts i entendre sense eines especials.
Els fitxers de de text pla es componen de tres parts principals:
- Capçalera: metadades sobre el contingut del fitxer (nom del fitxer, mida, tipus, etc.)
- Dades: contingut del fitxer tal com l’ha escrit el creador o editor
- Final del fitxer (EOF): caràcter especial que indica el final del fitxer.
Rutes (Paths)
Quan accediu a un fitxer en un sistema operatiu, cal una ruta de fitxer.
La ruta del fitxer és una cadena que representa la ubicació d’un fitxer. Està dividit en tres grans parts:
- Ruta de la carpeta: la ubicació de la carpeta de fitxers al sistema de fitxers on les carpetes posteriors estan separades per una barra inclinada
/(Unix,Linux i MacOS) o una barra invertida\(Windows) - Nom del fitxer: el nom real del fitxer
- Extensió: el final de la ruta del fitxer amb un punt ( .) que s’utilitza per indicar el tipus de fitxer
Anem a analitzar un cas molt habitual; imaginem que volem obrir el fitxer animals.csv des del programa read_file.py.
/│├── python_files/ ← working directory| │| ├── data/ ← Current working directory (cwd)| │ └── animals.csv| │| └── read_file.py ← Accessing this fileLa ruta del fitxer correcta per tractar-lo en aquest cas, suposant que estem a Linux, seria:
file_path = "data/animals.csv"És molt important l’ús de rutes de fitxers en aquest format, que es tracta d’una ruta relativa.
⚠Cal evitar sempre les rutes absolutes (per exemple: C:\Users\usuari1\file.py) o /home/user1 perquè només funcionen dins la màquina local i poden conduir a forats de seguretat.⚠
Modes d’accés a fitxers.
Per tal d’obrir un fitxer de text per treballar-hi; només cal usar la funció integrada open(), que només necessita la ruta del fitxer.
Apart de tenir el paràmetre necessari del file_name, informem el segon paràmetre, el mode, que pot tenir aquests valors:
- ‘r’ Obert per llegir
read(per defecte) - ‘w’ Obriu per escriure
write, truncant (sobreescrivint) el fitxer primer si existeix. - ‘x’ Obriu per escriure
writeun nou fitxer, si existeix el fixer retorna un error. - ‘a’ Obriu per escriure
append, si el fitxer existeix posa el contingut nou al final. - ‘rb’o’wb’ Obrir en mode binari (llegir/escriptura mitjançant dades de bytes).
També és important que sabeu que la paraula reservada with ens permet obrir el fitxer i tancar-lo automàticament.
⚠Avís: Recomanem usar `with open() per tal d’assegurar-vos que el fitxer es tanqui correctament i així evitar problemes!⚠
Mode read, r
Per provar els exemples no et cal cap llibreria especial.
Crea un nou projecte amb uv.
uv init fitxerscd fitxersAra, crea un fitxer anomenat demo.txt amb l’editor que vulguis.
O des del terminal si vols:
echo "Bon dia!" > demo.txtAquesta comanda t’ha creat un fitxer anomenat demo.txt amb aquesta línia:
Bon dia!Finalment, crea aquest programa en python que llegirà tot el contingut del fitxer.
El mètode read() llegeix totes les linies del fitxer.
file_name = 'demo.txt'with open(file_name, mode='r') as file: print(file.read())
print(f"Fitxer {file_name} llegit correctament.")El resultat que mostrarà és:
Bon dia!Fitxer demo.txt llegit correctament.
A que és molt fàcil 🤓🤓 ?
Control d’errors al llegir fitxers.
Si intentes llegir un fitxer que no existeix Python t’avisa amb aquest missatge d’ error:
Traceback (most recent call last): File "/home/miquel/Documents/pyprova/demof.py", line 2, in <module> with open(file_name, mode='r') as file: ^^^^^^^^^^^^^^^^^^^^^^^^^FileNotFoundError: [Errno 2] No such file or directory: 'demo.txt'Mode append, a
Per exemple, si volem afegir una nova linia al final d’un fitxer existent, és tan senzill com usar aquest codi:
with open('data/demo.txt', 'a') as appender: appender.write("\nHave a nice day!")El que fa aquest codi és posar el text Have a nice day! en el fitxer demo.txt que hem creat abans.
Per tant, el fitxer ara contindrà aquest contingut:
Bon dia!Have a nice day!Mode write, w (sobreescriptura)
En canvi, si volem crear un nou fitxer que no tenim, o sobreescriure un existent, usem el mode='w'.
file_name = 'species.txt'
# Obrim el fitxer en mode escriptura.with open(file_name, mode='w') as file: file.write("Homo sapiens\n") file.write("Mus musculus\n") file.write("Drosophila melanogaster\n")
print(f"Fitxer '{file_name}' escrit correctament.")**No oblidis obrir el fitxer amb el teu editor preferit (VSCOde, Pycharm, SublimeText…) per garantir que el programa ha funcionat!
Si volem escriure els continguts d’una llista, una línia cada element, ho podem aconseguir amb aquest codi:
file_name = 'sequences.txt'
# Llista de seqüències d'ADN.sequences = [ "ATGCGTAACG", "CGTACGTAGC", "TTAGGCATTA"]
# Obrim el fitxer en mode 'w' (escriptura). Si ja existeix, es sobreescriurà!with open(file_name, mode='w') as file: for seq in sequences: file.write(seq + '\n') # Cada seqüència a una nova línia
print(f"Fitxer '{file_name}' creat i seqüències escrites correctament.")Així, hem aconseguit escriure una sèrie de seqüències d’ADN, una per línia.
Encoding
Tingueu en compte que el format de codificació de caràcters del fitxer ha de ser l’adient per evitar errors.
Per exemple, si s’ha creat un fitxer amb la codificació UTF-8 (Unicode), amb millions de caràcters i intenteu analitzar-lo amb la codificació ASCII (128 caràcters), si hi ha un caràcter que es troba fora d’aquests 128 valors, es generarà un error.
També heu de tenir en compte Windows utilitza els caràcters \r\n per indicar una línia nova, mentre que Unix, Linux i les versions més noves de Mac utilitzen només el caràcter \n. Això pot provocar algunes complicacions quan esteu processant fitxers en un sistema operatiu diferent de l’origen del fitxer.
Anem a veure un exemple senzill.
Si a demo.txt tenim aquest contingut:
Com esteu?Espero que molt bé!Hem de tenir en compte un altre paràmetre: encoding="UTF-8"
with open('demo.txt', mode='r', encoding="UTF-8") as reader: # Read & print the entire file print(reader.read())
print("Fitxer demo.txt llegit correctament.")Altrament, el programa no interpretarà els accents ni altres caràcters é :
Com esteu?Espero que molt bé!Fitxer demo.txt llegit correctament.Crear directoris
Quan treballem amb molts fitxers ens interessa organitzar-los en directoris.
Si volem crear automàticament directoris on guardar els nous fitxers usarem la llibreria nativa de Python os, Operative System.
Per exemple, el mètode os.makedirs("new_files", exist_ok=True) crea un directori que es diu new_files en cas que no existeixi.
Provem crear 2 fitxers en un nou directori:
import os
os.makedirs("professorat", exist_ok=True)nom_fitxers = ["David", "Miquel"]
for nom_f in nom_fitxers: with open(f"professorat/{nom_f}.txt", mode='w', encoding="UTF-8") as file: file.write(f"Benvingut/da a l'Institut Provençana {nom_f}")
print("Fitxers creats correctament.")Hauràs comprovat que s’ha creat el nou directori i tants fitxers com noms hi ha a la llista.
Exercicis.
Per a completar els exercicis, primer crea el directori py_files i crea el fitxer oferta1.txt.
Ho pots fer amb entorn gràfic, per terminal o amb Python.
/│├── py_files/ ← working directory| │| ├── oferta1.txt| │| └── exercicis_files.pyPer terminal ho pots fer així:
mkdir py_filescd py_filesAmb Python tens aquestes instruccions:
import os
os.makedirs("professorat", exist_ok=True)El contingut del fitxer oferta1.txt ha de ser:
PythonPandasMatplotlibFastAPI3dJSReactMariaDB1.- Fes un programa que obri el fitxer, el llegeixi i mostri tot el seu contingut per pantalla.
with open('data/oferta1.txt', 'r') as reader: print(reader.read())2.- Crea un altre programa que obri el fitxer i a la última línia escrigui el següent text i icona. Revisa l’encoding.
Oferta revisada ✅with open('data/demo.txt', 'a', encoding="UTF-8") as appender: appender.write("\nOferta revisada ✅")3.- Crea un programa que guardi en un fitxer uns compostos químics que hem guardat en un diccionari, un per línia:
file_name = 'compostos.txt'
# Diccionari amb compostos químics i les seves fórmulescompostos = { "Aigua": "H2O", "Diòxid de carboni": "CO2", "Metà": "CH4", "Etanol": "C2H5OH"}En aquest cas, hauriem de tenir 4 línies de fitxer. La primera hauria de contenir:
Aigua: H2O# Obrim el fitxer en mode escripturawith open(file_name, mode='w') as file: for nom in compostos: file.write(f"{nom}: {compostos[nom]}\n")
print(f"Fitxer '{file_name}' escrit correctament.")