Pythonisti su Windows


Il post Gli utenti normali, quelli Windows  lasciava presagire un seguito, eccolo.

Intanto devo una precisazione all’amico G.: non erano rivolte a te le osservazioni relative a Word, PowerPoint e simili. Le ho scritte perché si parlava di Windows che non è il mio O.S. preferito usuale, si sa. Già che ci sono ne ho un altro paio:

  • i documenti “a bandiera”, come questo post, sono più leggibili, secondo me e i ‘mericani; sono meno belli e spesso capita che giustificano anche i miei documenti. È OK, ma controllate, non si sa mai che…
  • le presentazioni di PowerPoint si possono vedere benissimo su Linux, con i pacchetti Libre Office o Open Office. Idem per gli altri documenti di MS Office. Questi sono disponibili anche per Windows, gratuiti.

OK, per chi (ecco qui centra G.!) non si trova con il LISP ecco la versione Python dello script che sostituisce le virgole con punti decimali.

import sys

if len(sys.argv) == 1:
    print 'Manca il file dei dati'
    exit(2)

fname = sys.argv[1]
f = open(fname, 'r')
txt = f.read()
f.close()
txt = txt.replace('.', '')
txt = txt.replace(',', '.')
g = open('B_' + fname, 'w')
g.write(txt)
g.close()

Notare come le due versioni siano simili. La funzione usata si chiama replace in entrambi i linguaggi, entrambi leggono e scrivono il file in blocco. Con Python il file dev’essere aperto prima di operarci. la chiusura è in questo caso ridondante, avvenendo automaticamente all’uscita dello script. Su Windows è possibile creare l’eseguibile di uno script Python anche se non l’ho mai fatto e mi dicono che serve un po’ di magia (grigia, non nera).

Ecco, con uno dei due metodi precedenti otteniamo un file di testo con i numeri con i punti, come li vogliono i programmi usuali. Proviamo a leggere uno di questi file, usando Python.

f = open('B_psP.txt', 'r')
t = f.readline()
t = t.strip()
print "*" + t + "*"
d1 = 0
dfine = 999
while d1 != dfine:
	r = f.readline().strip()
	print r
	lst = r.split('\t')
	d1 = int(lst[0])
	d2 = float(lst[1])
	d3 = float(lst[2])
	print d1, d2, d3

f.close()

Funziona, bene. Però il codice ha qualche particolarità. Intanto la lettura viene fatta un’intera riga per volta, con readline. Con strip si tolgono il codice di fine linea (sia CRLF di Windows che LF di Unix/Linux) e eventuali spazi iniziali e finali.

Per leggere le triplette costituite da un intero e due reali si legge la stringa, la si trasforma in lista con split e infine si fanno le conversioni con int e float.

Cosa succede se si usa un altro linguaggio? Combinazione in questi giorni mi sto documentando sul Fortran (dai sempre quello!).
Eccolo nella sua versione antica (Fortran 77).

c234567
      program leggi
      character*80 t

      open(1, file='B_psP.txt')
      read(1, '(A)') t
      print *, t(:40)
      ifine = 999
    1 read(1, *) id1, d2, d3
      print *, id1, d2, d3
      if (id1 .ne. ifine) go to 1
      close(1)

      end

Compilando e eseguendo ottengo:

Orrendo: i numeri sono approssimati! Inoltre la stringa di titolo l’ho dichiarata di 80 caratteri ma poi ne ho fatto scrivere solo i primi 40. Infatti il Fortran riempie la stringa letta, troppo conta, con spazi. Infine per testare il “tappo” 999 di fine sono ricorso a un GOTO –non ditelo a Dijkstra, anzi resti fra noi. (Sul Fortran conto di tornarci molto presto con un codice decente, questo è come si usava quando c’ero io).

Una nota aggiuntiva: la versione Python potrebbe essere ottimizzata usando list comprehension ma risulterebbe meno chiara.

Una domanda: Python (o qualche altro linguaggio come Lua o Ruby) potrebbe essere usato al posto di Visual Basic? C’è qualche windowsiano che ne sa qualcosa?

About these ads
Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • compscient  Il 29 maggio 2012 alle 18:55

    > Su Windows è possibile creare l’eseguibile di uno script Python anche se non l’ho mai fatto e mi dicono che serve un po’ di magia (grigia, non nera).

    Py2exe ai tempi funzionava abbastanza bene, adesso c’è anche cx_freeze che (a quanto dicono) dovrebbe fare elf anche per linux (è discutibile l’utilità, ogni distribuzione di linux ha python installato)

    Però il <> al posto di != non si può vedere (certo, i Pythonisti deboli di cuore dovrebbero stare lontani anche dal while per leggere il file) :P

    > Una domanda: Python (o qualche altro linguaggio come Lua o Ruby) potrebbe essere usato al posto di Visual Basic?

    C’erano le pywin32 che permettevano di usare le API da python, però non l’ho mai usate. Cos’altro puoi fare con VB?

    • juhan  Il 29 maggio 2012 alle 19:05

      Hai ragione:
      1) mea culpa per non aver usato !=, l’abitudine; correggo :-D
      2) per l’.exe il problema è che non ho una macchina con Windows e Python sopra, come si vede anche gli screenshot dell’output sono su Ubuntu;
      3) VB è tuttora usatissimo con Windows, e la mia domanda (retorica) era per proporre un’alternativa. Cosa non facile, a quanto pare.

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 43 follower

%d bloggers like this: