将python csv转换成字典

发布于 2021-01-29 15:25:38

我对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]每个[名称],[年龄],[id]和[性别]都来自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)
关注者
0
被浏览
145
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    import csv
    
    reader = csv.reader(open('workers.csv', newline=''), delimiter=',', quotechar='"')
    workers = [ageName(row[0], row[1]) for row in reader]
    

    工人现在有所有工人的清单

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

    问题更改后添加了编辑

    您使用旧样式类有什么原因吗?我在这里使用新样式。

    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
    

    希望这能给您一些有关python序列功能的想法。;)

    编辑2,尽可能缩短…只是为了炫耀:P

    女士们,先生们,7(.5)行。

    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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看