--- 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.