---
title: M06 Accés a dades. 001. E/S amb fitxers.
tags: DAM, Java, M6
---
<div style="width: 30%; margin-left: auto;">

</div>
[Link en MarkDown](https://hackmd.io/@JdaXaviQ/HJTyCcfQo)
# M06 Accés a dades. UF01.
## E/S amb fitxers.
Amb python per escriure i llegir fitxers utilitzem descriptors de fitxers. Per aconseguir un descriptor de fitxer utilitzem la ordre __open()__.
Per exemple, per a crear i escriure dins d'un fitxer i posteriorment llegir el seu contingut:
```python
# --- E s c r i p t u r a
# Els paràmetres corresponen al nom del fitxer i al mode d'apertura
# en aquest cas 'w' correspon a escriptura.
print("[v] Escrivint a fitxer.")
el_meu_fitxer = open("hola_mon.txt", "w")
el_meu_fitxer.write("Hola món!")
el_meu_fitxer.close()
print("[v] Escritura correcta.")
# --- L e c t u r a
# La apertura sense mode indica de forma implícita només lectura
print("[v] Lectura des de fitxer.")
el_meu_fitxer = open("hola_mon.txt") # Només el nom del fitxer sense paràmetre equival a "r"
print(el_meu_fitxer.read())
el_meu_fitxer.close()
print("[v] Lectura correcta.")
```
[v] Escrivint a fitxer.
[v] Escritura correcta.
[v] Lectura des de fitxer.
Hola món!
[v] Lectura correcta.
Tot i que aquest scrip funciona, a partir d'ara utilitzarem la estructura __'with'__ per a obtenir el descriptor del fitxer, d'aquesta forma sempre tancarem els nostres fitxers encara que no posem explícitament la sentència __close()__ o salti alguna excepció en runtime.
```python
# --- E s c r i p t u r a
# Els paràmetres corresponen al nom del fitxer i al mode d'apertura
# en aquest cas 'w' correspon a escriptura.
print("[v] Escrivint a fitxer.")
with open("hola_mon.txt", "w") as el_meu_fitxer:
el_meu_fitxer.write("Hola món!\n")
print("[v] Escritura correcta.")
# --- L e c t u r a
# La apertura sense mode indica de forma implícita només lectura
print("[v] Lectura des de fitxer.")
with open("hola_mon.txt") as el_meu_fitxer: # Només el nom del fitxer sense paràmetre equival a "r"
print(el_meu_fitxer.read())
print("[v] Lectura correcta.")
```
[v] Escrivint a fitxer.
[v] Escritura correcta.
[v] Lectura des de fitxer.
Hola món!
[v] Lectura correcta.
Els modes d'apertura que ens proporciona open() són:
* r -> lectura. És el valor per defecte. Provoca un error si el fitxer no existeix.
* w -> escriptura. Si no existeix el fitxer el crea, sobrescriu el contingut anterior que hi pugui haver.
* a -> escriptura afegint el contingut al final. Crea el fitxer si no existeix.
* x -> creació. Crea i deixa obert per a escriure. Si existeix provoca un error.
Addicionalment podem indicar si el fitxer s'ha d'obrir en mode text o en mode binari:
* t -> text. És el valor per defecte.
* b -> binari.
Per exemple:
with open("image.jpg", "rb") as imatge_binaria:
```python
print("[v] Afegint contingut a fitxer.")
with open("hola_mon.txt", "a") as el_meu_fitxer:
el_meu_fitxer.write("Adeu món cruel!\n")
print("[v] Escritura correcta.")
```
[v] Afegint contingut a fitxer.
[v] Escritura correcta.
## Bonus tracks
1. La instrucció read(size) admet opcionalment un paràmetre 'size' que indica en nombre de caracters o bytes a llegir.
2. Existeix la opció de llegir línia a línia en fitxers de text amb la instrucció readLine() que opcionalment també admet com a paràmetre el nombre de línies a llegir (per defecte només 1).
3. Podem obtenir un array de línies de text amb la comanda readLines().
```python
print("[v] Llegint línia a línia.")
index = 0
with open("hola_mon.txt", "r") as el_meu_fitxer:
linea = el_meu_fitxer.readline()
while linea:
index += 1
print(f"[{str(index)}] : {linea}", end="")
linea = el_meu_fitxer.readline()
print("[v] Escritura correcta.")
```
[v] Llegint línia a línia.
[1] : Hola món!
[2] : Adeu món cruel!
[v] Escritura correcta.