Tema 7: Mòduls i fitxers

Objectius i argument

Aquest tema es dedica a dues qüestions que, si bé estàn desconnexes del la apert central del curs, són de gran importància. Es tracta per una banda dels mòduls, un mecanisme per millorar la organització del codi i augmentar-ne el reaprofitament, i per altre banda dels fitxers, el medi bàsic d'emmagatzematge d'informació externa.

Resultats d'aprenentatge

Una estudiant que hagi superat aquest tema ha de ser capaç de:

  • Dissenyar mòduls senzills.
  • Usar mòduls des de programes o altres mòduls.
  • Comprendre el concepte d'àmbit i la seva aplicació pràctica.
  • Fer programes que emmagatzemen resultats en fitxers.
  • Fer programes que llegeixen les dades de fitxers.

Conceptes clau

Mòdul. Sentència import. Àmbit (namespace). Conflicte d'identificadors. Sentència continue. Atributs i operador d'accés als atributs. Mètodes d'un objecte. Mètodes dels strings. Mètodes de les llistes. Fitxers. Fitxers de text. Obrir, llegir/escriure, tancar. Final de fitxer. Fitxers de text. Directoris. El mòdul sys. Argv i el pas de paràmetres a l'executable.

Referència principal

  • How to Think Like a Computer Scientist: Learning with Python 2nd Edition: (capítol 10).

Referències complementàries

Exercicis obligatoris de teoria

Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.

EOT 7.1

Creeu un mòdul anomenat modul1.py. Afegiu els atributs edat amb valor inicial la vostra edat, i any amb valor incial l'any actual. Creeu un altre mòdul anomenat modul2.py. Afegiu els atributs edat amb valor incial 0, i any amb valor l'any que vau nàixer. Ara creeu un fitxer anomenat test_espai_de_noms.py. Importeu-hi els dos mòduls anteriors (import modul1 i import modul2) i escribiu la següent sentència:

print (modul2.edat - modul1.edat) == (modul2.any - modul1.any)

Executeu el fitxer test_espai_de_noms.py i expliqueu quin és el resultat que obteniu.

EOT 7.2

>>> import this

Què ens diu en Tim Peter de l'espai de noms?

EOT 7.3

Escriviu un programa anomenat mitjana.py que prengui una seqüència de nombres de la línia de comandes i retorni la mitjana dels seus valors. Una sessió del vostre programa funcionant amb la mateixa entrada ha de generar la mateixa sortida que a continuació:

$ python mitjana.py 3 4
3.5
$ python mitjana.py 3 4 5
4.0
$ python mitjana.py 11 15 94.5 22
35.625

EOT 7.4

Escriviu un programa anomenat mediana.py que prengui una seqüència de nombres de la línia de comandes i retorni la mediana dels seus valors (podeu consultar en què consisteix el càlcul de la mediana aquí). Una sessió del vostre programa funcionant amb la mateixa entrada ha de generar la mateixa sortida que a continuació:

$ python mediana.py 19 85 121
85
$ python mediana.py 11 15 16 22
15.5

EOT 7.5

unsorted_fruits.txt conté una llista de 26 fruites, cada una d'elles amb un nom que comença per una lletra diferent de l'abecedari. Escriviu un programa anomenat ordena_fruites.py que llegeixi les fruites del fitxer unsorted_fruits.py i els escrigui en ordre alfabètic en un fitxer anomenat fruites_ordenades.py.

EOT 7.6

Escriviu un programa anomenat tres_linies.py que llegeixi les fruites del fitxer unsorted_fruits.py i les escrigui en grups de tres (tres fruites / línia en blanc / tres fruites / linia en blanc / etc.) en un fitxer anomenat paquets_fruita.py.

EOT 7.7

Escriviu un programa anomenat canvia_lletres.py que prengui una lletra per la línia de comandes i llegeixi les fruites del fitxer unsorted_fuits.py i les escrigui en un fitxer anomenat canvi_vocals_fruites.py, canviant totes les vocals que trobi per la lletra passada per la línia de comandes.

 

Exercicis obligatoris de laboratori

Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.

EOL 7.1

Dissenyeu e implementeu en Python un programa que crei un fitxer de text, el nom del qual serà passat per paràmetre per l'usuari en la línea de ordres, que contindrà tots els mètodes i dades dels mòduls string i list. Feu que cada informació disponible surti en una línea diferent.

EOL 7.2

En aquest exercici es demana que dissenyeu i implementeu un programa que llegeix un text d'un fitxer A, el processa i escriu una sèrie de dades sobre el contingut del fitxer A en un altre fitxer, el fitxer B. Per exemple, si invoquem el porgrama de la següent manera,

$ python tractartext.py prova.txt hola que mes ara si

llavors en el fitxer "resultat.txt" s'hauria d'escriure el següent contingut:

RESULTATS EN PROVA.TXT:
=======================
Paraula més llarga: caligraficàment
Caràcter que apareix més vegades: lletra "a", 2.045 vegades
La paraula "hola" surt 3 vegades repetida, la paraula "que" surt 25 vegades repetida, la paraula "mes" surt
4 vegades repetida, la paraula "ara" surt 2 vegades repetida, la paraula "si" no surt cap vegada.
En les cinc primeres línies, la paraula que més és repeteix és: "mes"

Per a resoldre el problema, cal que seguiu els següents passos:

  1. Dissenyeu un mòdul de nom “tractaparaules.py” que contingui les següents funcions:
  • neteja_paraula, que serà una funció tal que, donada una paraula, eliminarà tots els caràcters anteriors i posteriors d'aquesta que no siguin lletres. Per exemple:
    • de la paraula "vols?", ens retornaria "vols".
    • De la paraula "@#€hola23@#€#" ens retornaria "hola".
  • extreu_paraula, que donada una cadena de caràcters retorni una llista en que cada element d'aquesta sigui una paraula de la cadena de caràcters sense símbols, números, ni caràcters especials. Per exemple, de la cadena de caràcters "hola, que vols per menjar?", retornaria la llista ['hola','que','vols','per','menjar'].
  • conta_paraula, que donada una paraula com a cadena de caràcters i  una llista de paraules, retorna un enter que serà el número de vegades que apareix la paraula dins de la llista donada. Per exemple, donada la cadena de caràcters "hola, que vols per menjar? que?" i la paraula "que" tornaria el valor 2.
  • conta_caracter, que donada una llista de paraules, retorna quin és el caràcter que més es repeteix (incloent caràcters especials)
  • paraula_llarga, que donada una llista de paraules, retorna quina és la paraula més llarga. Si hi ha varies paraules de la mateixa llargària, retornarà la d'ordre inferior alfabèticament.
  • Dissenyeu un programa de nom “tractatext.py”.  En la invocació d'aquest programa se li poden passar fins a un màxim de 10 arguments de crida. El primer paràmetre serà el nom d'un fitxer de text existent. La resta de paràmetres hauran de ser paraules. Aquest programa haurà d'obrir el fitxer de text passat com a primer argument, en mode lectura i escriure en un altre fitxer de text anomenat "resultat.txt" les següents dades:
    • el nom del arxiu que estem tractant,
    • el caràcter que més vegades surt escrit al fitxer,
    • la paraula més llarga del fitxer i,
    • quantes vegades surten al fitxer la resta de paraules entrades com a paràmetres a l'hora de fer la crida.
    • També ha de emmagatzemar la paraula que surt repetida més cops tenint en comte només les 5 primeres línies de text.
  • Aquest segon fitxer on guardarem els resultats s'haurà de crear la primera vegada que executem el programa però desprès s'haurà d'anar actualitzant, sense esborrar cap dada guardada anteriorment.

    Per a la realització d'aquest exercici ajudeu-vos de totes les possibles funcions o mètodes disponibles en qualsevol dels mòduls o classes disponibles.

    Exercicis optatius

    EOP 7.1

    Dissenyeu un programa que obtingui els 100 primers nombres primers i els guardi en un fitxer de text anomenat primers.txt.

    EOP 7.2

    Dissenyeu un programa que donada una llista d'enters proporcionada pel teclat en calculi el nombre més repetit de la llista.

    EOP 7.3

    Dissenyeu una funció anomenada data_llarga que retorni la data en format textual. Per exemple, l'"11/11/2009 "sigui "11 de novembre de 2009". Aquesta data s'introduirà per teclat i l'execució del programa ha d'escriure's en el fitxer datallarga.txt

    EOP 7.4

    Dissenyeu un programa que compti el nombre de caràcters d'un fitxer de text, incloent els salts de línia. El nom del fitxer es demana a l'usuari per teclat

     

     

     python tractatext.py prova.txt hola que mes ara si