---
# System prepended metadata

title: M06 Accés a dades. 001. E/S amb fitxers.
tags: [' Java', DAM, ' M6']

---

---
title: M06 Accés a dades. 001. E/S amb fitxers.
tags: DAM, Java, M6
---

<div style="width: 30%; margin-left: auto;">
    
![](https://hackmd.io/_uploads/HJiR4eGJT.png)    
    
</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.
