Re: [Python] unire dati da due csv
Il problema è che csv.reader ti ritorna un tipo di oggetto iterabile, che non è l'ideale per fare i merge e lavorare con tabelle come vuoi fare tu. Per me csv è una libreria da utilizzare a basso livello, ma per lavorare con dati in forma di tabella ci sono almeno tre alternative efficenti in python. La prima passa per numpy e il pacchetto di librerie scientifiche di python. Prova ad utilizzare numpy.recfromtxt, numpy.recfromcsv o numpy.genfromtxt al posto di csv.reader, per leggere files csv. from numpy import genfromtxt coords = numpy.recfromtxt(invitations-coord.txt, names=True, delimiter=';', quotechar='|') coords['x'] # assumendo che in invitations-coord.txt vi sia una colonna chiamata x [lista di tutti i valori della colonna x] I recarray hanno diversi vantaggi, in termini di efficienza di memoria e facilitá di utilizzo, rispetto a liste e dizionari di python (per lavorare con file tabulari). Da qui, se ho ben capito tu vuoi fare un JOIN come in SQL. Non so bene quale sia la funzione esatta per farlo con numpy, ma ti puoi ispirare alla funzione join_by qui: - http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html Un altro sistema è appoggiarsi ad un sistema SQL, ovvero caricare il CSV con python, transformarlo in una tabella SQL (SQLite per esempio) e fare il join tramite il DBMS... se hai grandi quantitá di dati, questo sistema puó essere piuttosto efficente, perchè un qualsiasi DBMS è in grado di effettuare operazioni di JOIN nativamente. Adesso peró non ti saprei dire quale libreria utilizzare... ti potresti ispirare da: http://www.daniweb.com/forums/thread297790.html Purtroppo è da tempo che ho abbandonato l'idea di utilizzare python per lavorare con dati di tipo tabulare, perchè è troppo scomodo. Preferisco utilizzare R e la funzione merge integrata nativamente (http://rss.acs.unt.edu/Rdoc/library/base/html/merge.html). Tra l'altro, esiste anche Rpy2, una libreria per chiamare funzioni di R da python, posto che tu abbia installato entrambi gli interpreti. 2010/10/16 Simone Gabbriellini simone.gabbriell...@gmail.com: Salve Lista, vorrei unire dati appartenenti a due csv.reader che leggo così: coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|') nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|') sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader. Grazie in anticipo per ogni aiuto/suggerimento! cordialmente, Simone ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python -- Giovanni Dall'Olio, phd student Department of Biologia Evolutiva at CEXS-UPF (Barcelona, Spain) My blog on bioinformatics: http://bioinfoblog.it ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
Il giorno 18 ottobre 2010 15:00, Giovanni Marco Dall'Olio dalloli...@gmail.com ha scritto: Un altro sistema è appoggiarsi ad un sistema SQL, ovvero caricare il CSV con python, transformarlo in una tabella SQL (SQLite per esempio) e fare il join tramite il DBMS... se hai grandi quantitá di dati, questo sistema puó essere piuttosto efficente, perchè un qualsiasi DBMS è in grado di effettuare operazioni di JOIN nativamente. Concordo pienamente... Recentemente sto facendo un lavoro proprio in questo modo. Porto le tabelle CSV in SQLite e da li faccio tutti i MERGE che mi interessano. E' il metodo più comodo in assoluto... Purtroppo è da tempo che ho abbandonato l'idea di utilizzare python per lavorare con dati di tipo tabulare, perchè è troppo scomodo. Preferisco utilizzare R e la funzione merge integrata nativamente (http://rss.acs.unt.edu/Rdoc/library/base/html/merge.html). Tra l'altro, esiste anche Rpy2, una libreria per chiamare funzioni di R da python, posto che tu abbia installato entrambi gli interpreti. Ultimamente sto guardando anche io R. Molto interessante soprattutto perchè all'università usavo Matlab... Peccato che manca sempre il tempo :-) ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] unire dati da due csv
Salve Lista, vorrei unire dati appartenenti a due csv.reader che leggo così: coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|') nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|') sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader. Grazie in anticipo per ogni aiuto/suggerimento! cordialmente, Simone ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
2010/10/16 Simone Gabbriellini simone.gabbriell...@gmail.com Salve Lista, Salve Simone :-) vorrei unire dati appartenenti a due csv.reader che leggo così: coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|') nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|') sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader. Qualche domanda per darti una risposta più sensata: 1) quante righe hanno i due file? 2) i nomi univoci sono nello stesso ordine? 3) vuoi un csv che abbia un numero di colonne pari alla somma dei due csv iniziali? Ciao. Marco. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
2010/10/16 Simone Gabbriellini simone.gabbriell...@gmail.com: sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader. Potresti essere un po' piu` specifico? Mi sembra di capire che tu abbia tue CSV tipo: CSV1: nome, anni pippo, 30 franco, 60 CSV2: nome, capelli pippo, 5834 franco, 312 e tu voglia come risultato: CSV_out nome, anni, capelli pippo, 30, 5834 franco, 60, 312 Corretto? in questo caso, se : - la prima colonna e` fatta da nomi unici - il numero di righe e` lo stesso - le righe sono nello stesso ordine allora una soluzione potrebbe essere: def csv_merge(csvr_a, csvr_b, csvw_out): for row_a, row_b in zip(csvr_a, csvr_b): csvw_out.writerow(row_a + row_b[1:]) csv_out = csv.writer(open('csv_out.txt', w+)) csv_merge(coordReader, nodesReader, csv_out) Ciao, Andrea ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
On 16/ott/2010, at 13:24, Andrea Ambu andrea...@gmail.com wrote: allora una soluzione potrebbe essere: def csv_merge(csvr_a, csvr_b, csvw_out): for row_a, row_b in zip(csvr_a, csvr_b): csvw_out.writerow(row_a + row_b[1:]) csv_out = csv.writer(open('csv_out.txt', w+)) csv_merge(coordReader, nodesReader, csv_out) Suggerisco anche itertools.izip al posto di zip nel caso di un grande numero di righe. Ciao. Marco. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
Ciao, Grazie dell'aiuto! Dunque le righe sono circa 500, i nomi non sono nello stesso ordine (ecco il mio principale problema), e quello che vorrei è un csv con le colonne pari alla somma di quelle dei due csv di partenza meno una, quella dei nomi che non vorrei replicare. Grazie, Simone Sent from my iPhone Il giorno 16/ott/2010, alle ore 12:02, Marco Beri marcob...@gmail.com ha scritto: 2010/10/16 Simone Gabbriellini simone.gabbriell...@gmail.com Salve Lista, Salve Simone :-) vorrei unire dati appartenenti a due csv.reader che leggo così: coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|') nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|') sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader. Qualche domanda per darti una risposta più sensata: 1) quante righe hanno i due file? 2) i nomi univoci sono nello stesso ordine? 3) vuoi un csv che abbia un numero di colonne pari alla somma dei due csv iniziali? Ciao. Marco. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
Ciao, e tu voglia come risultato: CSV_out nome, anni, capelli pippo, 30, 5834 franco, 60, 312 Corretto? è corretto, però nel mio caso la lista dei nomi nei due csv non ha lo stesso ordine. potrei ordinarle però prima di iniziare il merge? ciao, simone ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] unire dati da due csv
2010/10/16 Simone Gabbriellini simone.gabbriell...@gmail.com: è corretto, però nel mio caso la lista dei nomi nei due csv non ha lo stesso ordine. potrei ordinarle però prima di iniziare il merge? No, ordinarli prende tempo, e probabilmente il doppio della memoria, se non sono tantissime righe (x colonne) conviene salvare un csv (quello con meno colonne) tutto in memoria e poi iterare sul secondo e scrivere al volo sul csv def csv_merge(csvr_a, csvr_b, csvw_out): a_dict = {} a_fieldnames = None for row_a in csvr_a: if a_fieldnames == None: a_fieldnames = row_a else: a_dict[row_a[0]] = row_a b_fieldnames = None for row_b in csvr_b: if b_fieldnames == None: b_fieldnames = row_b csvw_out.writerow(a_fieldnames + b_fieldnames[1:]) else: csvw_out.writerow(a_dict[row_b[0]] + row_b[1:]) csv_out = csv.writer(open('out.txt', w+)) csv_merge(coordReader, nodesReader, csv_out) se dai come primo parametro il csv con meno colonne è meglio. -- Andrea ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python