【问题标题】:python csv into dictionarypython csv到字典
【发布时间】: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。

标签: python csv


【解决方案1】:
import csv

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

workers 现在拥有所有工人的列表

>>> 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)

【讨论】:

  • 哇,这正是我要找的东西 reader = csv.reader(open('Book.csv'), delimiter=',', quotechar='"') workers = [ageName(row [0], row[1], row[2]) for row in reader] for i in range(len(workers)): print workers[i].lname, workers[i].fname, workers[i].身份证
  • 您不能将“print”定义为方法将其用作同一模块上的语句。
  • 我在写它的时候一直在思考,我认为它可能会起作用。但我现在改了。
  • 哇,这太酷了。我是 python 新手,所以我不知道新/旧样式是什么。我将不得不在休息期间学习它。你能再帮我做一件事吗?您的代码很棒,但给出了两个错误: Traceback(最近一次调用最后一次):文件“D:/Python26/test2.py”,第 13 行,在 学生 = [Student(row) for row in reader] File" D:/Python26/test2.py",第 5 行,在 init (self.lname,self.fname,self.ID,self.sport) = row ValueError: too many values to unpack跨度>
  • 哦,实际上如果我添加 [1::] back 会给出这个错误而不是 Traceback (最近一次调用最后): File "D:/Python26/test2.py", line 13, in students = [Student(row) for row in reader[1::]] TypeError: '_csv.reader' object is unsubscriptable
【解决方案2】:

我知道这是一个很老的问题,但是阅读这个是不可能的,更不用说令人惊叹的新(ish)Python 库pandas。它的主要分析单元是一种称为 DataFrame 的思想,它以 R 处理数据的方式为模型。

假设您有一个名为example.csv 的(非常愚蠢的)csv 文件,如下所示:

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

如果您想以双倍的速度读取 csv 文件并对其进行“填充”,那么为了简洁或易于使用,您将很难击败以下代码:

>>> 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

在我看来,这真是太棒了。永远不要再遍历 csv.reader 对象!

【讨论】:

  • 相当不错。谢谢。哦,之后呢?快4年了! :)
  • 这就是网络世界的疯狂之处:它永不消亡!我在一个完全正常的谷歌搜索过程中遇到了这个问题。希望您查看pandas 并享受它!
【解决方案3】:

我同意马克的建议。特别是,查看 csv 模块中的 DictReader,它允许将逗号分隔(或通常分隔)的文件作为字典读取。

查看PyMotW's coverage of csv module 以获取快速参考和 DictReader、DictWriter 的使用示例

【讨论】:

  • 我不明白为什么这会得到 -1 没有解释性评论。使用 DictReader 的建议有什么问题?
  • 我不得不说,您发布的链接非常有用=)。打算投票给你。 (Mod 的,我假设没问题?)
【解决方案4】:

你看过 csv 模块吗?

import csv

【讨论】:

  • 是的,我做到了。事实上,我有一个写得很糟糕的版本,但我意识到这很痛苦,所以我决定马上做字典。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2015-08-21
相关资源
最近更新 更多