Input/Output Console e File http://www.dia.uniroma3.it/~roselli/ roselli@dia.uniroma3.it
Credits Materiale a cura del Prof. Franco Milicchio
Introduzione Le istruzioni di stampa servono a rendere visibili all esterno del programma i valori delle variabili Le istruzioni di lettura servono ad acquisire dall esterno i valori delle variabili È possibile leggere e scrivere da diversi dispositivi di input e output Console File
Storia Il termine console è un termine francese che indica un tavolo I primi computer avevano come periferiche una telescrivente, ovvero una teletype (TTY) Da qui, il termine per indicare una periferica fisica di input o output Terminale solitamente indica un emulatore software di una console
Stream Lo stream (in Italiano è flusso) è semplicemente una sequenza di dati Uno stream si apre, si legge, si scrive, si chiude I dati da stampare vengono visti come una sequenza di caratteri da inviare al dispositivo di uscita (il dispositivo attinge dal flusso) I dati da leggere vengono visti come provenienti da un flusso che origina dal dispositivo di ingresso (il programma attinge dal flusso)
Stream RAM CPU Output Input CPU RAM
Stream Standard I sistemi operativi definiscono solitamente tre stream standard Flusso di uscita: standard output stdout Flusso di ingresso: standard input stdin Flusso di error: standard error stderr Di default, lo standard output è lo schermo, l input è la tastiera, e l errore compare generalmente a schermo Nota storica: questi stream hanno l eredità del C e UNIX
Print Gli stream sono comuni a tutti i linguaggi procedurali Ogni linguaggio ha proprie istruzioni di input ed output, come ad esempio read e write in Pascal, o << in C++ In Python esiste l istruzione print 1 che stampa su stdout, la cui sintassi è: print arg1, arg2, Qualunque espressione sia passata alla istruzione di stampa, verrà prima di tutto valutata, per poi poterne stampare il valore 1 In Python 3 print è divenuta una funzione: print(arg1, arg2, )
Esempio di Stampa Esempio: print "L'area vale", area In ordine, viene stampata la stringa L'area vale, seguita dal valore della variabile area (una volta valutata) Nota bene: tra gli argomenti separati da virgole viene inserito uno spazio Infine viene stampato os.linesep, che è il carattere per andare a capo (vedi la tabella ASCII per new line \n e carriage return \r, os è una libreria) La stampa avviene se e solo se non esistono errori nell istruzione (e.g., stampare una variabile inesistente, un valore illegale come ad esempio 1/0) L area vale 452.3
Raw Input Come per la stampa, Python fornisce un meccanismo per leggere dati dallo standard input, i.e., la tastiera In Python esiste la funzione raw_input(prompt) 1 che legge da stdin, la cui sintassi è: raw_input(prompt = ) In ordine, il programma sospende l esecuzione, stampa la stringa prompt (opzionale), l utente scrive una serie di caratteri alla tastiera e preme invio La funzione restituisce una stringa, la quale può esser assegnata ad una variabile 1 In Python 3 raw_input è divenuta la funzione input
Esempio di Lettura Esempio: area = raw_input( Immettere l area: ) In ordine, viene stampata la stringa Immettere l area, dopo di che il programma attende un input da tastiera seguito da invio Nota bene: il prompt viene stampato (se fornito), e non vengono aggiunti spazi né caratteri di a capo Ovviamente se non si associa ad una variabile il valore restituito dalla funzione, tale valore è perso
Caratteri Standard Alcuni caratteri non stampabili sono standard in Python (derivano dal C), come ad esempio: Tabulatore: "\t" Nuova riga: "\n" Inizio riga: "\r" Se si desidera stampare un carattere speciale, come ad esempio ", è necessario farlo precedere da backslash, ovvero \" print "Virgolette: \"" Virgolette: "
Caveat Viene letto l input, compresi i caratteri non stampabili (e.g., spazi, tabulature) Alcuni IDE (e.g., PyCharm) impediscono l immissione di alcuni caratteri Il valore restituito è una stringa di caratteri, la cui interpretazione è a cura del programmatore Con un typecast esplicito è possibile convertire una stringa in un diverso tipo Attenzione: caratteri invalidi possono portare ad errori di interpretazione
Typecast: Esempio q = raw_input("numero:") print "Doppio = ", int(q) * 2 Numero:3 Doppio = 6 Numero:ciao Doppio = Traceback (most recent call last): File "/Users/sensei/Desktop/aaa/a.py", line 10, in <module> print "Doppio = ", int(q) * 2 ValueError: invalid literal for int() with base 10: 'ciao'
Print e Standard Stream In realtà l istruzione print seguita dai parametri da stampare è una forma breve di stampa su uno stream predefinito, standard output La forma più lunga con lo stream esplicito è la seguente: import sys print >> sys.stdout, arg1, arg2, Usando la libreria sys è possibile specificare lo stream standard di output, come sopra, oppure lo standard stream d errore, sys.stderr
File I dati prodotti sullo standard output sono volatili, se il PC si spegne sono persi Spesso è necessario salvare permanentemente i dati di un programma Python fornisce molti modi di salvare dati su disco: file testuali, file binary, database, ed altri Introdurremo ora i file testuali, semplici da analizzare con qualunque editor di testo (compreso PyCharm)
File di Testo Per aprire un file è necessario usare l istruzione open( nome, modo ) Il primo parametro indica il nome del file da aprire Il secondo indica la modalità, ovvero in lettura r (default), o scrittura w Senza specificare altro, il file si troverà nella cartella dello script Python; se un file in lettura non esiste, la funzione andrà in errore, in scrittura verrà creato La funzione open restituisce un oggetto file necessario per scrivere o leggere Attenzione: se si apre un file esistente in scrittura il suo contenuto verrà sovrascritto, perdendo tutti i dati del file
Input da File Una volta aperto il file, è possibile iterarci sopra come se fosse una lista Esempio: f = open("a.txt", "r") for i in f: print i Attenzione: leggendo dal file verranno inclusi anche i caratteri di a capo È sempre possibile effettuare un typecast esplicito per operare sul file
Input: Esempio f = open("a.txt", "r") s = 0.0 for i in f: print "letto valore reale: ", float(i) s = s + float(i) print "somma totale: ", s File a.txt 10.2 20.5 30.3 letto valore reale: 10.2 letto valore reale: 20.5 letto valore reale: 30.3 somma totale: 61.0
Comma Separated Values: Esempio f = open("a.txt", "r") for i in f: print "letto: ", i p = i.split(",") print "lista: ", p for j in p: print ">>> valore", float(j) File a.txt 10.2, 40.8 20.5, 30.5 30.3, 20.7 letto: 10.2, 40.8 lista: ['10.2', ' 40.8\n'] >>> valore 10.2 >>> valore 40.8 letto: 20.5, 30.5 lista: ['20.5', ' 30.5\n'] >>> valore 20.5 >>> valore 30.5 letto: 30.3, 20.7 Notare il carattere a capo lista: ['30.3', ' 20.7'] >>> valore 30.3 >>> valore 20.7
Output a File Una volta aperto, è possibile scrivere nel file con un metodo dell oggetto file Esempio: f = open("a.txt", "w") f.write( 3.1415\n ) Si possono scrivere su file solo alcuni tipi di oggetto, tra questi le stringhe Python non aggiungerà il carattere di a capo per ogni scrittura
Output: Esempio l = [1.1, 2.2, 3.3, 4.4, -11.11] f = open("a.txt", "w") for i in l: f.write(str(i) + "\n") 1.1 2.2 3.3 4.4-11.11