Fitxers de text =============== Fitxers ------- Els fitxers - contenen les dades (i programes) emmagatzemats en dispositius d'emmagatzematge *no volàtils* - s'identifiquen amb un *nom* que és un `camí `__ dins del sistema de fitxers - poden ser *de text* o *binaris* en funció del seu contingut Per tal d'accedir al contingur d'un fitxer des d'un programa cal .. table:: +---------------------------------+------------------------------------+ | obrir el fitxer en mode lectura | obrir el fitxer en mode escriptura | +---------------------------------+------------------------------------+ | llegir el contingut | escriure el contingut | +---------------------------------+------------------------------------+ | tancar el fitxer | tancar el fitxer | +---------------------------------+------------------------------------+ Fitxers de text --------------- - Un :term:`fitxer de text` conté caràcters organitzats en línies - Una *línia* és un *string* acabat amb un :term:`caràcter de control` salt de línia (``'\n'``) - És habitual llegir-los línia a línia: .. sourcecode:: python with open(nom_fitxer, 'r') as fitxer: for linia in fitxer: # Tractar la línia - I escriure'ls línia a línia: .. sourcecode:: python with open(nom_fitxer, 'w') as fitxer: for element in estructura_de_dades: linia = calcula_linia(element) fitxer.write(linia) # linia ha de contenir `\n` Obrir ----- - Funció :py:func:`open` .. sourcecode:: python fitxer = open(nom_fitxer, mode) - `nom_fitxer` és un *string* que conté el :term:`nom de fitxer`. Pot ser un `camí relatiu o absolut `__ - :term:`mode` també és un string i pot ser lectura (``'r'``) o escriptura (``'w'``) - `fitxer` és un :term:`objecte fitxer` - Permet accedir al contingut del fitxer o escriure-hi mitjançant l'objecte fitxer - Reserva un recurs del sistema operatiu - Què passa si - obrim per lectura un fitxer que existeix? Podem accedir al seu contingut - obrim per lectura un fitxer que no existeix? Error :exc:`FileNotFoundError` - obrim per escriptura un fitxer que existeix? Perd el contingut antic i només contindrà allò que hi escribim - obrim per escriptura un fitxer que no existeix? Crea el fitxer amb el contingut que hi escribim Tancar ------ - Mètode :py:meth:`~io.IOBase.close` .. sourcecode:: python fitxer.close() - Allibera el recurs del sistema operatiu Per què usar la sentència ``with``? ----------------------------------- Garanteix que el fitxer queda tancat en acabar d'executar-se el bloc, fins i tot si es produeix un :term:`error d'execució` Operacions ---------- En mode lectura ~~~~~~~~~~~~~~~ - El mètode :py:meth:`~io.TextIOBase.read` llegeix des del caràcter actual del fitxer fins al final o fins al nombre de caràcters, si es crida amb un argument - El mètode :py:meth:`~io.IOBase.readline` llegeix la línia següent del fitxer En mode escriptura ~~~~~~~~~~~~~~~~~~ - El mètode :py:meth:`~io.TextIOBase.write` escriu un *string* al fitxer - Cal acabar les línies amb el :term:`caràcter de control` salt de línia (``'\n'``) Algorismes ---------- En mode lectura ~~~~~~~~~~~~~~~ - Els :term:`objectes fitxer ` són :term:`iterables `, com les :term:`seqüències ` i els diccionaris .. important:: Però s'esgoten. De fet, són :term:`iteradors ` - Els :doc:`/algorismes/index` són :term:`algorismes ` sobre iterables: els :term:`esquemes ` de :term:`recorregut ` i l\':term:`esquema de cerca` serveixen per als fitxers - Per tal de recòrrer el número de línia i la línia, cal usar el :ref:`recorregut-index` amb :func:`enumerate` En mode escriptura ~~~~~~~~~~~~~~~~~~ - Anàlegs a la creació de llistes amb :meth:`~list.append` a partir de la llista buida - Obrir el fitxer en mode escriptura equival a la llista buida - Escriure una línia amb :meth:`~io.TextIOBase.write` equival a afegir un element a la llista amb :meth:`~list.append` Exercicis --------- - :doc:`fi:temes/fitxers/Bolets/index` - :doc:`fi:temes/fitxers/Edats/index` - :doc:`fi:temes/fitxers/Control_horari/index` - :doc:`fi:examens/curs2022-2023/1/L3/G40/correus_e`