Profilo di Marco Buttu

Nome Marco Buttu
Indirizzo email marco.buttu@gmail.com
AvatarAvatar utenti
Messaggi1
Firma forum
Marco Buttu
  • Re: Esercizio...
    Forum >> Programmazione Python >> Scripting
    Ciao, il problema nasce dal flush del buffer. Quando scrivi su file, cio' che scrivi (tipicamente) non viene immediatamente scritto sul file-system. Viene tenuto in memoria, in un buffer. Il buffer viene svuotato automaticamente quando il file viene chiuso, oppure quando si chiama in modo esplicito il metodo flush() del file-object, o i metodi seek() e tell(). Guarda qua:




    >>> f = open('myfile', 'w')
    
    >>> f.write('pippo')
    
    5
    





    Se guardi il contenuto del file 'myfile', vedrai che e' ancora vuoto. Adesso chiudi il file:

    >>> f.close()
    





    Ora puoi verificare che il contenuto e' stato scritto su 'myfile'.

    Nell'esempio che hai mostrato, il file non viene esplicitamente chiuso. Questo su Linux non crea (non dovrebbe creare...) problemi, perche' il file viene chiuso in modo automatico quando non vi sono piu' riferimenti ad esso. Su Windows evidentemente non e' cosi', e il file non viene chiuso, per cui il buffer non viene svuotato. Puoi risolvere il problema usando la parola chiave with (spiegata piu' avanti nel libro):

    >>> with open('mynewfile', 'w') as f:
    
    ...     f.write('pippo')
    





    Questa fa si che il file venga chiuso automaticamente all'uscita dal blocco with. Infatti puoi verificare che il contenuto e' stato scritto su 'mynewfile'. Altra cosa che puoi fare, piuttosto che usare with, e' mettere un out.close() nella linea sotto la print(), in modo da chiudere autometicamente il file.




    Puoi anche gestire il buffering in modo diverso (spiegato cap.3). La open() ha infatti un parametro buffering, che ti consenti di personalizzare il buffering, per l'appunto. Ad esempio, se usi buffering=1, allora il contenuto del buffer verra' svuotato ad ogni newline:




    >>> f = open('afile', 'w', buffering=1)
    
    >>> f.write('ciaoooo\n')  # Nota che c'e' \n
    
    8
    



    Se fai una prova, vedrai che il testo e' stato gia' scritto sul file.




    Detto cio', quello che mi pare strano e' che su Windows, al termine del processo, non venga chiuso il file e quindi svuotato il buffer. Qualcuno su Windows puo' verificare? Ad esempio, aprendo una sessione interattiva ed eseguendo:

    >>> f = open('myfile', 'w')
    
    >>> f.write('foooooo')
    
    7
    
    >>> import sys
    
    >>> sys.exit(0)
    





    Sul file 'myfile' e' presente il testo 'foooooo'?




    PS. Nel prossimo capitolo viene descritto come utilizzare il modulo argparse della libreria standard, per gestire il parsing degli argomenti passati da linea di comando. Quello che hai visto in questo esercizio serve solamente per sapere cosa fa argparse dietro le quinte.
    Marco Buttu