[Python] Gestione dei file di testo (newbie)
Salve a tutti, sono nuovo a questa mailing list e sono nuovo a python. Il problema che sto affrontando è questo: Ho una rubrica in un file di testo di un programma che si chiama abook, il file di configurazione si chiama abookrc. Il file è impostato in questo modo: [1] name="Tizio" email="[EMAIL PROTECTED]" phone="" [2] ... [n] Quello che vorrei fare è leggere il file e caricare ogni record in memoria, possibilmente avendo delle variabili con lo stesso nome utilizzato nel file di configurazione. Prima opzione: Esiste qualche funzione che mi permette di cavarmela velocemente? Seconda opzione: Devo studiare qualche espressione regolare particolare? Terza opzione: Devo leggere carattere per carattere e scrivere una funzione che mi crea i record in memoria? -- Alessandro Rendina ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Gestione dei file di testo (newbie)
On Sat, Nov 17, 2007 at 12:18:46PM +0100, ale wrote: > Salve a tutti, > sono nuovo a questa mailing list e sono nuovo a python. > Il problema che sto affrontando è questo: > > Ho una rubrica in un file di testo di un programma che si chiama abook, > il file di configurazione si chiama abookrc. > > Il file è impostato in questo modo: > > [1] > name="Tizio" > email="[EMAIL PROTECTED]" > phone="" > > [2] > ... > > [n] > > Quello che vorrei fare è leggere il file e caricare ogni record in > memoria, possibilmente avendo delle variabili con lo stesso nome > utilizzato nel file di configurazione. > > Prima opzione: > Esiste qualche funzione che mi permette di cavarmela velocemente? Si ConfigParser, un modulo standard e visto che sei nuovo, la pappa già fatta dovrebbe essere questa: from ConfigParser import ConfigParser c = ConfigParser() c.read('abookrc') class Ref(object): def __init__(self, data): for key, val in data: ## hai " nel file abookrc, quindi li tolgo setattr(self, key, val.strip('"')) for ref in c.sections(): r = Ref(c.items(ref)) print vars(r) ## diamo una occhiata agli oggetti creati... sandro *:-) ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] python e yaml
Salve, sto provando a utilizzare PyYaml, ma ho qualche problema, in particolare con le maps. Ho ad esempio un semplice file (file.yaml) simile a questo: a: 1 b: 2 Dalla shell di python faccio: >>> stream = file("file.yaml", "r") >>> yaml.load(stream) {'a': 1, 'b': 2} E fin qui, quindi, tutto ok. Non mi è chiaro (leggendo varia documentazione di PyYaml non sono riuscito a capirlo) come assegnare il documento yaml a un oggetto in python. Ho provato così: >>> d = yaml.load(stream) In questo modo la variabile "d" dovrebbe diventare un dizionario, ma se provo ad accedere a un suo elemento: >>> d["a"] Traceback (most recent call last): File "", line 1, in d['a'] TypeError: 'NoneType' object is unsubscriptable infatti: >>> type(d) Da cosa può dipendere? Grazie, Carlo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] python e yaml
On Nov 17, 2007 4:58 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote: > Ho ad esempio un semplice file (file.yaml) simile a questo: > > a: 1 > b: 2 > > Dalla shell di python faccio: > > >>> stream = file("file.yaml", "r") > >>> yaml.load(stream) > {'a': 1, 'b': 2} > > E fin qui, quindi, tutto ok. > Non mi è chiaro (leggendo varia documentazione di PyYaml non sono > riuscito a capirlo) come assegnare il documento yaml a un oggetto in > python. > > Ho provato così: > > >>> d = yaml.load(stream) > > In questo modo la variabile "d" dovrebbe diventare un dizionario, ma > se provo ad accedere a un suo elemento: > Ciao, per prima cosa ti consiglio di usare le versioni safe (safe_load e safe_load_all) per evitare problemi, a meno che non sia necessario; per il tuo problema, io ho appena provato a replicarlo e invece sembra funzionare. Siccome su questa macchina non avevo installato pyyaml, l'ho scaricato e poi ho fatto letteralmente: >>> data = """ ... a: 1 ... b: 2 ... """ >>> >>> yaml.load(data) {'a': 1, 'b': 2} >>> d = yaml.load(data) >>> type(d) >>> d['a'] 1 >>> type(yaml.load(data)) Cosa succede se fai type(yaml.load(data)) ? ciao, francesco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] python e yaml
On Nov 17, 2007 5:24 PM, Francesco Guerrieri <[EMAIL PROTECTED]> wrote: > Cosa succede se fai type(yaml.load(data)) ? >>> d = yaml.load(stream) >>> type(d) >>> type(yaml.load(stream)) Però, provando come hai fatto tu: >>> data = """ a: 1 b: 2 """ >>> yaml.load(data) {'a': 1, 'b': 2} >>> d = yaml.load(data) >>> type(d) >>> d['a'] 1 Solo che io avrei bisogno di utilizzare i file :\ ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] python e yaml
On Nov 17, 2007 5:35 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote: > On Nov 17, 2007 5:24 PM, Francesco Guerrieri <[EMAIL PROTECTED]> wrote: > > Cosa succede se fai type(yaml.load(data)) ? > > >>> d = yaml.load(stream) > >>> type(d) > > >>> type(yaml.load(stream)) > > > Però, provando come hai fatto tu: > > >>> data = """ >a: 1 >b: 2 >""" > >>> yaml.load(data) > {'a': 1, 'b': 2} > >>> d = yaml.load(data) > >>> type(d) > > >>> d['a'] > 1 > > > Solo che io avrei bisogno di utilizzare i file :\ La soluzione è semplice: se gli passi un file lui parte dalla prima riga e arriva fino all'ultima. E quindi, la prima volta funziona: my_file = open('prova) yaml.load(my_file) e funziona come nel tuo esempio Ma ora my_file è stato letto tutto e tu sei alla EOF. Allora basta fare my_file.seek(0) e riprovare :-) my_file.seek(0) d = yaml.load(my_file) et voilà :-) usando una stringa tipo data = """ a: 1 b: 2 """ non ci sono problemi di EOF, di iteratori che hanno consumato il file etc etc perché gli stai sempre passando tutto il documento YAML. Naturalmente questo comportamento è tipico della lettura dei file, non è specifico per yaml. ciao fra ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] python e yaml
On Nov 17, 2007 5:52 PM, Francesco Guerrieri <[EMAIL PROTECTED]> wrote: > La soluzione è semplice: se gli passi un file lui parte dalla prima > riga e arriva fino all'ultima. > E quindi, la prima volta funziona: > my_file = open('prova) > yaml.load(my_file) > > e funziona come nel tuo esempio > Ma ora my_file è stato letto tutto e tu sei alla EOF. Allora basta > fare my_file.seek(0) e riprovare :-) > my_file.seek(0) > d = yaml.load(my_file) Perfetto, grazie mille :D Non penso ci sarei mai arrivato da solo. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Tkinter e classi (era: Re: [Python] Re: Digest di Python, Volume 19, Numero 11)
Grazie a tutti delle risposte; in almeno due c'era codice che fa quello che cercavo, e adesso mi acculturerò su cos'è una new-style class. Nel frattempo però... Sandro Dentella ha scritto: PS: io non ho idea di cosa faccia Tkinter.Tk() ma se ricordo corretto apre una finestra 'root' mentre toplevel è solo... una toplevel. Di 'root'ce ne è una sola, di Toplevel ce ne possono essere tante. Perchè erediti da una classe per poi sostituirla con una classe diversa, invece che ereditare direttamente da Tk? Perché siccome la documentazione di Tkinter.Tk dice "Return a new Toplevel widget", non pensavo che Tk fosse una classe di per sé, ma una funzione che restituisce un Toplevel "opportunamente trattato". E tutt'ora non so come verificarlo, dato che... Marco Mariani ha scritto: type(Tkinter.Tk()) cosa dice? ... ci avevo già provato, ma... In [1]: type(Tkinter.Tk()) Out[1]: ... e questo non mi illumina granché... Pietro ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: Tkinter e classi (era: Re: [Python] Re: Digest di Python, Volume 19, Numero 11)
On Nov 18, 2007 2:18 AM, Pietro Battiston <[EMAIL PROTECTED]> wrote: > In [1]: type(Tkinter.Tk()) > Out[1]: > > ... e questo non mi illumina granché... Uno dei vantaggi di passare alle classi new-style è che type diventa molto più informativo. Con le vecchie classi, come hai visto, ti dice solo che hai un'istanza di qualcosa. Con le nuove... provalo tu stesso class Prova(object): pass type(Prova()) Ne segue che Tkinter.Tk è una old-style class :-) ciao fra ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python