Python: Input-Output

Interfaccia Utente

Ritorna Operatore Significato
str raw_input([str]) Fa una domanda all’utente e restituisce la risposta

Esempio. Faccio una domanda all’utente:

risposta = raw_input("scrivi tre parole separate da spazi: ")

print risposta
print type(risposta)

Ho messo nella variabile risposta la risposta dell’utente (che e’ sempre una stringa). Il contenuto di risposta dipende dall’utente, che potrebbe aver dato una risposta qualunque.

Voglio controllare che abbia effettivamente risposto con tre parole separate da spazi:

parti = parole.split()

print "hai scritto", len(parti), "parole"

reazione_a = {True: "bravo!", False: "impegnati di piu'"}
print reazione_a[len(parti) == 3]

Esempio. Faccio una domanda all’utente:

risposta = raw_input("scrivi due numeri: ")

print risposta
print type(risposta)

Voglio stampare la somma dei numeri dati dall’utente. Prima estraggo le varie parole, poi le converto in float, poi eseguo la somma e la stampo:

parti = risposta.split()

numero_1 = float(parti[0])
numero_2 = float(parti[1])

print "la loro somma e'", numero_1 + numero_2

Esercizi

  1. Usando raw_input(), chiedere all’utente il suo piatto preferito, mettere il risultato in una variabile cibo, poi stampare a schermo: anche a me piace ed il piatto preferito.

  2. Chiedere all’utente due interi, diciamo a e b, poi un terzo intero, diciamo risultato.

    Controllare se la somma di a e b e’ uguale a risultato: in tale caso stampare a schermo True, altrimenti False.

  3. Chiedere all’utente una chiave ed un valore, e costruire un dizionario che include (solo) quella coppia chiave-valore. Stampare a schermo il risultato.

  4. Chiedere all’utente il suo nome, metterlo nella variabile nome, poi stampare a schermo il nome assicurandosi che le prime lettere di tutte le parole del nome siano maiuscole e le altre minuscole.

    Infine stampare a schermo il risultato.

Interfaccia Filesystem

Ritorna Operatore Significato
file open(str, [str]) Restituisce un riferimento ad un file
str file.read() Legge i contenuti del file
str file.readline() Legge una riga dal file
list-of-str file.readlines() Legge tutte le righe del file
None file.write(str) Scrive una stringa nel file
file.close() Chiude il riferimento ad un file

Ci sono diverse modalita’ di accesso usabili con open():

  1. "r": modalita’ di sola lettura (non posso scrivere nel file). Questo e’ il default.
  2. "w": modalita’ di sola scrittura (non posso leggere dal file), sovrascrivendo.
  3. "a": modalita’ di sola scrittura (non posso leggere dal file), appendendo.
  4. "rw": modalita’ di lettura e scrittura, sovrascrivendo.
  5. "ra": modalita’ di lettura e scrittura, appendendo.

Esempio. Apro un file in modalita’ di lettura:

un_file = open("data/aatable", "r")

print type(un_file)                 # file

Il primo argomento e’ il percorso al file che voglio aprire (in questo caso un percorso relativo alla directory da cui ho fatto partire python), il secondo "r"" specifica in che modalita’ aprire il file.

Avvertimento

Non potete usare directory speciali, ad esempio "~" (la vostra home) nel percorso che date a open().


Esempio. Una volta aperto un file:

un_file = open("data/aatable", "r")

leggo i contenuti o per intero, in un’unica stringa:

contenuti = un_file.read()
print contenuti
print type(contenuti)

oppure per intero ma spezzati in una lista di righe:

righe = un_file.readlines()
print righe
print type(righe)

oppure una sola riga alla volta, dalla prima in giu’:

riga_1 = un_file.readline()
riga_2 = un_file.readline()
riga_3 = un_file.readline()

print riga_1
print riga_2
print riga_3

Avvertimento

Una volta aperto un file, non posso leggere due volte la stessa riga.

Questo vuol dire che una volta che ho letto tutto il file, ad esempio usando readlines() (che legge tutto il contenuto), se uso una seconda volta readlines() o qualunque altro metodo di lettura, questa mi restituira’ una riga vuota.

Ad esempio:

un_file = open("data/aatable", "r")
# non ho ancora letto niente, quindi readlines() mi
# restituisce tutti i contenuti del file

contenuti = un_file.readlines()
print len(contenuti)

# ora che ho letto tutti i contenuti, non resta piu' niente
# da leggere, e infatti...
contenuti_2 = un_file.readlines()
print len(contenuti_2)

# qui contenuti_2 ha ZERO righe

Visto che il file e’ stato aperto con open() in modalita’ di sola lettura, non posso scriverci dentro:

un_file.write("del testo\n")

perche’ Python mi da’ errore:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: File not open for writing
#        ^^^^^^^^^^^^^^^^^^^^^^^^^
#         il file non e' aperto in modalita' di scrittura!

La stessa cosa accade se provo a leggere da un file aperto in modalita’ di sola scrittura (sia con "w" che con "a").


Esempio. Per aprire un file in cui mettere i risultati di un lunghissimo calcolo:

file_dei_risultato = open("risultati", "w")

print type(un_file)

# blah blah blah
# blah blah blah
# blah blah blah

file_dei_risultati.close()

Una volta finito di leggere o scrivere, chiamo close().

Avvertimento

Per i file aperti in modalita’ di scrittura (con "w", "rw", "ra", ...), close() si assicura che tutto cio’ che avete detto a Python di scriverci effettivamente finisca per essere scritto nel file.

Se dimendicate di chiamare close() la scrittura nel file potrebbe non accadere.


Esempio. Chiedo all’utente il nome di un file (che puo’ esistere o meno), e poi cosa vuole scriverci:

percorso = raw_input("dove vuoi scrivere? ")
testo = raw_input("cosa vuoi scrivere? ")

il_file = open(percorso, "w")
il_file.write("l'utente ha scritto:\n" + testo)
il_file.close()

Ora riapro lo stesso file, ma in modalita’ di lettura, ne leggo i contenuti e li stampo a schermo:

stesso_file = open(percroso, "r")
contenuti = stesso_file.read()
stesso_file.close()

print "Nel file ", percorso, " hai scritto:"
print contenuti

Esercizi

Avvertimento

Se open() vi da’ errore, puo’ darsi che vi troviate nella directory sbagliata. Aggiustate il percorso di conseguenza.

  1. Usate open() per aprire il file "data/aatable" in modalita’ di sola lettura, mettendo il risultato di open() nella variabile f.

    Poi usate readlines() per leggere il contenuto del file, mettendo il risultato in righe.

    Di che tipo e’ righe? Di che tipo e’ il primo elemento di righe? Quante righe ci sono nel file?

  2. Usate open() per aprire il file "data/aatable" in modalita’ di sola lettura, mettendo il risultato di open() nella variabile f.

    Poi usate readline() (non readlines()!) per leggere la prima riga del file, mettendo il risultato in prima_riga.

    Quante righe sono rimaste da leggere? Controllate usando readlines().

    A questo punto, quante altre righe sono rimaste da leggere?

  3. Usate open() per aprire il file "output.txt" in modalita’ di sola scrittura "w", mettendo il risultato di open() nella variabile f.

    Poi scrivete la stringa "prova prova uno due tre prova" nel file.

    Chiudete il file usando il metodo close().

    Ora invece aprite "output.txtx" in modalita’ di sola lettura e stampate a schermo i suoi contenuti.

  4. usate open() per aprire il file "poesia.txt" in modalita’ di sola scrittura. Poi scrivete nel file le stringhe in questa lista, una per riga:

    versi = [
        "S'i fosse fuoco, arderei 'l mondo"
        "s'i fosse vento, lo tempestarei"
    ]
    

    Ora fare la stessa cosa aprendo due volte il file "poesia2.txt" in modalita’ di sola scrittura (appendendo), ed ogni volta scrivendoci uno dei due versi.

    Cosa succede se riapro "poesia2.txt" in modalita’ "w" e lo richiudo subito?

  5. Scrivere un modulo trucco.py che stampa il codice del modulo stesso a schermo.

    Curiosita’: abbiamo appena scritto (barando!) un programma di Quine.