【发布时间】:2009-12-14 00:08:45
【问题描述】:
我对 python 很陌生。我需要创建一个将 csv 数据加载到字典中的类。
我希望能够控制键和值 所以说下面的代码,我可以随时取出worker1.name或worker1.age。
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
#
'''
但我无法将我的 csv 数据加载到键和值中。
[1] 我想创建自己的密钥 worker1 = ageName([name],[age],[id],[gender])
[2] 每个 [name],[age],[id] 和 [gender] 都来自 csv 数据文件中的特定列
我真的不知道该怎么做。我尝试了很多方法,但都失败了。我需要一些帮助才能开始。
---- 编辑 这是我的原始代码
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()
这是我当前的代码(不完整)
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)
【问题讨论】:
-
请注意,如果您真的想要字典,则不能使用
worker1.name来获取值。使用worker1['name']形式访问字典。那么,你真正想要的是哪一个? -
嗨,彼得。很抱歉,我非常感谢您的评论。这是个好问题。有什么优点和缺点吗?对不起……
-
利弊总是有的,但你要字典。你的意思是你不知道你是否应该使用一个?要回答这个问题,我们需要更多地了解您将如何处理这些数据。
-
我怀疑只是因为所有实例数据都存储在属于该实例的字典中而造成了一些混乱。
-
我刚刚编辑了我的帖子。您可以查看我的原始代码和当前代码。我正在创建一个小程序,使 STUDENT 成为对象,具有性别、姓名等属性。使用 Tor Valamo 的代码(目前)对于某些东西来说是个好主意。然而,当我开始执行其他任务时,我发现自己反复声明 for i in range loop 只是为了提取整个 student.fnames、student.lnames、student.ID。