2009-12-14 2 views
9

Sono abbastanza nuovo per Python. Devo creare una classe che carichi i dati CSV in un dizionario.python csv nel dizionario

Voglio essere in grado di controllare i tasti e il valore Quindi diciamo il seguente codice, posso estrarre worker1.name o worker1.age ogni volta che voglio.

class ageName(object): 
'''class to represent a person''' 
def __init__(self, name, age): 
self.name = name 
self.age = age 

worker1 = ageName('jon', 40) 
worker2 = ageName('lise', 22) 

#Now if we print this you see that it`s stored in a dictionary 
print worker1.__dict__ 
print worker2.__dict__ 
# 
''' 
{'age': 40, 'name': 'jon'} 
# 
{'age': 22, 'name': 'lise'} 
# 
''' 
# 

#when we call (key)worker1.name we are getting the (value) 
print worker1.name 
# 
''' 
# 
jon 
# 
''' 

Ma sono bloccato a caricare i miei dati csv in chiavi e valore.

[1] Voglio creare le mie chiavi worker1 = ageName ([nome], [età], [id], [sesso])

[2] ogni [nome], [età] , [id] e [genere] provengono da una specifica colonna in un file di dati CSV

Non so davvero come lavorare su questo. Ho provato molti metodi ma ho fallito. Ho bisogno di aiuto per iniziare.

---- Modifica Questo è il mio codice originale

import csv 

# let us first make student an object 

class Student(): 
    def __init__(self): 
     self.fname = [] 
     self.lname = [] 
     self.ID = [] 
     self.sport = [] 
     # let us read this file 
     for row in list(csv.reader(open("copy-john.csv", "rb")))[1:]: 
      self.fname.append(row[0]) 
      self.lname.append(row[1]) 
      self.ID.append(row[2]) 
      self.sport.append(row[3]) 
    def Tableformat(self): 
     print "%-14s|%-10s|%-5s|%-11s" %('First Name','Last Name','ID','Favorite Sport') 
     print "-" * 45 
     for (i, fname) in enumerate(self.fname): 
      print "%-14s|%-10s|%-5s|%3s" %(fname,self.lname[i],self.ID[i],self.sport[i]) 
    def Table(self): 
     print self.lname 

class Database(Student): 
    def __init__(self): 
     g = 0 
     choice = ['Basketball','Football','Other','Baseball','Handball','Soccer','Volleyball','I do not like sport'] 
     data = student.sport 
     k = len(student.fname) 
     print k 
     freq = {} 
     for i in data: 
      freq[i] = freq.get(i, 0) + 1 
     for i in choice: 
      if i not in freq: 
       freq[i] = 0 
      print i, freq[i] 


student = Student() 
database = Database() 

Questo è il mio codice corrente (incompleta)

import csv 
class Student(object): 
    '''class to represent a person''' 
    def __init__(self, lname, fname, ID, sport): 
     self.lname = lname 
     self.fname = fname 
     self.ID = ID 
     self.sport = sport 
reader = csv.reader(open('copy-john.csv'), delimiter=',', quotechar='"') 
student = [Student(row[0], row[1], row[2], row[3]) for row in reader][1::] 
print "%-14s|%-10s|%-5s|%-11s" %('First Name','Last Name','ID','Favorite Sport') 
print "-" * 45 
for i in range(len(student)): 
    print "%-14s|%-10s|%-5s|%3s" %(student[i].lname,student[i].fname,student[i].ID,student[i].sport) 

choice = ['Basketball','Football','Other','Baseball','Handball','Soccer','Volleyball','I do not like sport'] 
lst = [] 
h = 0 
k = len(student) 
# 23 
for i in range(len(student)): 
    lst.append(student[i].sport) # merge together 

for a in set(lst): 
    print a, lst.count(a) 

for i in set(choice): 
    if i not in set(lst): 
     lst.append(i) 
     lst.count(i) = 0 
     print lst.count(i) 
+0

Si noti che se si desidera veramente un dizionario, non è possibile utilizzare 'worker1.name' per ottenere i valori. Si accede ai dizionari usando il modulo 'worker1 ['nome']'. Quindi, quale vuoi veramente? –

+0

Ciao Peter. Mi dispiace e apprezzo molto il tuo commento. Questa è una bella domanda. Qualche pro e contro? Mi dispiace ... – CppLearner

+0

Ci sono sempre pro e contro, ma hai chiesto un dizionario. Vuoi dire che non sai se dovresti usarne uno o no? Per rispondere, dovremmo capire di più su cosa farai con i dati. –

risposta

12
import csv 

reader = csv.reader(open('workers.csv', newline=''), delimiter=',', quotechar='"') 
workers = [ageName(row[0], row[1]) for row in reader] 

lavoratori ha ora un elenco di tutti i lavoratori

>>> workers[0].name 
'jon' 

aggiunto di modifica dopo aver domanda è stata alterata

C'è qualche motivo per cui stai usando classi di stile vecchi? Sto usando il nuovo stile qui.

class Student: 
    sports = [] 
    def __init__(self, row): 
     self.lname, self.fname, self.ID, self.sport = row 
     self.sports.append(self.sport) 
    def get(self): 
     return (self.lname, self.fname, self.ID, self.sport) 

reader = csv.reader(open('copy-john.csv'), delimiter=',', quotechar='"') 
print "%-14s|%-10s|%-5s|%-11s" % tuple(reader.next()) # read header line from csv 
print "-" * 45 
students = list(map(Student, reader)) # read all remaining lines 
for student in students: 
    print "%-14s|%-10s|%-5s|%3s" % student.get() 

# Printing all sports that are specified by students 
for s in set(Student.sports): # class attribute 
    print s, Student.sports.count(s) 

# Printing sports that are not picked 
allsports = ['Basketball','Football','Other','Baseball','Handball','Soccer','Volleyball','I do not like sport'] 
for s in set(allsports) - set(Student.sports): 
    print s, 0 

Spero che questo ti dia alcune idee sulla potenza delle sequenze di Python. ;)

modifica 2, accorciato per quanto possibile ... solo per mostrare: P

Onorevoli colleghi, 7 (.5) linee.

allsports = ['Basketball','Football','Other','Baseball','Handball', 
      'Soccer','Volleyball','I do not like sport'] 
sports = [] 
reader = csv.reader(open('copy-john.csv')) 
for row in reader: 
    if reader.line_num: sports.append(s[3]) 
    print "%-14s|%-10s|%-5s|%-11s" % tuple(s) 
for s in allsports: print s, sports.count(s) 
+0

Wooo questo è esattamente quello che stavo cercando reader = csv.reader (aperto ('Book.csv'), delimitatore = ',', quotechar = '"') worker = [ageName (row [0], row [1], riga [2]) per riga nel lettore] per i in gamma (len (lavoratori)): addetti stampa [i] .lnome, lavoratori [i] .fname, lavoratori [i] .ID – CppLearner

+0

tu non posso definire "print" come un metodo * e * usarlo come una dichiarazione sullo stesso modulo – nosklo

+0

Ci stavo pensando mentre lo scrivevo, e pensavo che potesse funzionare, ma l'ho cambiato ora –

2

Avete guardato il modulo csv?

import csv 
+0

Sì, l'ho fatto. In effetti ho una versione mal scritta, ma mi rendo conto che è stato un dolore al collo e quindi ho deciso di fare il dizionario subito. – CppLearner

8

I secondo suggerimento di Marco. In particolare, guarda DictReader dal modulo csv che consente di leggere un file separato da virgole (o delimitato in generale) come dizionario.

Guardate PyMotW's coverage of csv module per un rapido riferimento ed esempi di utilizzo del DictReader, DictWriter

+0

Non capisco perché questo ha ottenuto un -1 senza un commento esplicativo. Cosa c'è di sbagliato con un suggerimento di usare un DictReader? – CruiZen

+0

Devo dire che il link che hai postato è stato abbastanza utile =). Vado a votare su quello. (Mod's, suppongo che sia ok?) – victorhooi

+0

Grazie @victorhooi – CruiZen

9

So che questa è una domanda piuttosto vecchio, ma è impossibile leggere questo, e non pensare alla straordinaria nuova (ish) Python libreria, pandas. La sua unità di analisi principale è un concetto chiamato DataFrame che è modellato sul modo in cui R gestisce i dati.

Diciamo che avete una (molto stupida) file CSV denominato example.csv che assomiglia a questo:

day,fruit,sales 
Monday,Banana,10 
Monday,Orange,20 
Tuesday,Banana,12 
Tuesday,Orange,22 

Se si desidera leggere in un file CSV in tempo doppio rapido, e fare 'cose' con esso , si sarebbe difficile da battere il seguente codice sia per brevità e facilità d'uso:

>>> import pandas as pd 
>>> csv = pd.read_csv('example.csv') 
>>> csv 
     day fruit sales 
0 Monday Banana  10 
1 Monday Orange  20 
2 Tuesday Banana  12 
3 Tuesday Orange  22 
>>> csv[csv.fruit=='Banana'] 
     day fruit sales 
0 Monday Banana  10 
2 Tuesday Banana  12 
>>> csv[(csv.fruit=='Banana') & (csv.day=='Monday')] 
     day fruit sales 
0 Monday Banana  10 

a mio parere, questo è davvero roba fantastico. Non ripetere mai più un oggetto csv.reader!

+1

Abbastanza carino. Thansk. Oh, dopo cosa? Quasi 4 anni! :) – CppLearner

+0

Questa è la cosa pazza del mondo online: non muore mai! Mi sono imbattuto in questa domanda in una sessione googling perfettamente normale. Spero che dai un'occhiata a 'panda 'e divertiti! – LondonRob