Re: [Python] unire dati da due csv

2010-10-18 Per discussione Giovanni Marco Dall'Olio
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

2010-10-18 Per discussione Vittorio Zuccala'
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

2010-10-16 Per discussione Simone Gabbriellini
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 Per discussione Marco Beri
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 Per discussione Andrea Ambu
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

2010-10-16 Per discussione Marco Beri
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

2010-10-16 Per discussione Simone Gabbriellini
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

2010-10-16 Per discussione Simone Gabbriellini
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 Per discussione Andrea Ambu
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