python csv в словарь

Я довольно новичок в питоне. Мне нужно создать класс, который загружает данные 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([имя],[возраст],[id],[пол])

[2] каждое [имя], [возраст], [идентификатор] и [пол] происходит из определенного столбца в файле данных 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)

person CppLearner    schedule 14.12.2009    source источник
comment
Обратите внимание: если вам действительно нужен словарь, вы не можете использовать worker1.name для получения значений. Доступ к словарям осуществляется с помощью формы worker1['name']. Итак, чего вы действительно хотите?   -  person Peter Hansen    schedule 14.12.2009
comment
Привет Питер. Мне очень жаль, и я очень ценю ваш комментарий. Это хороший вопрос. Есть плюсы и минусы? Мне жаль...   -  person CppLearner    schedule 14.12.2009
comment
Всегда есть плюсы и минусы, но вы просили словарь. Вы имеете в виду, что не знаете, следует ли вам использовать его или нет? Чтобы ответить на этот вопрос, нам нужно больше узнать о том, что вы собираетесь делать с данными.   -  person Peter Hansen    schedule 14.12.2009
comment
Я подозреваю, что есть просто некоторая путаница из-за того, что все данные экземпляра хранятся в словаре, принадлежащем экземпляру.   -  person Tor Valamo    schedule 14.12.2009
comment
Я только что отредактировал свой пост. Вы можете увидеть мой оригинальный и текущий коды. Я создаю небольшую программу, которая делает STUDENT объектом с такими атрибутами, как пол, имя. Использование кода Tor Valamo (в настоящее время) является хорошей идеей для некоторых вещей. Однако по мере того, как я переходил к другим задачам, я неоднократно заявлял, что i in range loop просто вытаскивает все student.fnames, student.lnames, student.ID.   -  person CppLearner    schedule 14.12.2009
comment
я отредактировал свой ответ, чтобы показать вам некоторые ярлыки вашего редактирования.   -  person Tor Valamo    schedule 14.12.2009


Ответы (4)


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(0,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)
person Community    schedule 14.12.2009
comment
Wooo это именно то, что я искал reader = csv.reader(open('Book.csv'), delimiter=',', quotechar='') workers = [ageName(row[0], row[1], row[2]) для строки в считывателе] для i в диапазоне (len(workers)): print workers[i].lname, workers[i].fname, workers[i].ID - person CppLearner; 14.12.2009
comment
вы не можете определить print как метод и использовать его как инструкцию в том же модуле. - person nosklo; 14.12.2009
comment
Я думал об этом, пока писал, и подумал, что, может быть, это сработает. Но я изменил его сейчас. - person Tor Valamo; 14.12.2009
comment
воооо это круто. Я новичок в python, поэтому не знаю, что такое новый/старый стиль. Мне придется выучить его за перерыв. Не могли бы вы помочь мне еще с одной вещью? Ваш код отличный, но выдает две ошибки: Traceback (последний последний вызов): Файл D:/Python26/test2.py, строка 13, в ‹module› student = [Student(row) for row in reader] Файл D:/ Python26/test2.py, строка 5, в init (self.lname,self.fname,self.ID,self.sport) = строка ValueError: слишком много значений для распаковки - person CppLearner; 14.12.2009
comment
о, на самом деле, если я добавлю [1::] назад, вместо Traceback будет выдана эта ошибка (последний последний вызов): Файл D:/Python26/test2.py, строка 13, в ‹module› студенты = [Студент (строка) для строки in reader[1::]] TypeError: объект '_csv.reader' не подлежит подписке - person CppLearner; 14.12.2009
comment
Я использую 2.6.4 кстати, если это поможет - person CppLearner; 14.12.2009
comment
Я обновил пару строк вокруг вашей проблемы. Обратите внимание, что он читает строку заголовка и сначала печатает ее, поэтому нет необходимости нарезать читатель (чего вы не можете, поскольку это итератор, поэтому вы получили ошибку). - person Tor Valamo; 14.12.2009
comment
Спасибо Тор. Мне нужно многому научиться. Я закончу свою программу и вернусь, чтобы поблагодарить вас и попросить дополнительную информацию (как стать очень хорошим кодером Python) - person CppLearner; 14.12.2009
comment
Этот код все еще можно улучшить, я просто не знаю, все ли это вам нужно. Если да, то я могу сократить его примерно на 10 строк :P - person Tor Valamo; 14.12.2009
comment
Это то, что я хочу... 10 строк? ... боже мой -_- Если можно, я бы выучил это.... хахаха Спасибо - person CppLearner; 14.12.2009
comment
мило... Тор. Я не буду использовать короткую версию, потому что она слишком хороша. Хахаха. но, пожалуйста, мне очень жаль беспокоить вас. В длинной версии есть небольшая проблема, которую я искал. for s in set(students.sports): # атрибут класса AttributeError: объект 'list' не имеет атрибута 'sports'. Вот и все. Если я смогу решить эту проблему, я смогу реализовать больше самостоятельно. Опять же, я очень рад, что такие люди, как вы, помогают мне... У меня было всего два занятия по python, и мой профессор ожидал, что я напишу программу базы данных за два дня... спасибо - person CppLearner; 14.12.2009
comment
о, это должен быть Student.sports - person Tor Valamo; 14.12.2009
comment
Кроме того, последние несколько строк были немного изменены, поэтому обязательно обновите и их. - person Tor Valamo; 14.12.2009
comment
почему бы тебе не close файл плз? или лучше использовать with? - person Aprillion; 20.05.2015

Я знаю, что это довольно старый вопрос, но невозможно читать это и не думать об удивительной новой (выше) библиотеке Python, pandas. Его основной единицей анализа является структура, называемая DataFrame, которая смоделирована по образцу того, как R обрабатывает данные.

Допустим, у вас есть (очень глупый) CSV-файл с именем example.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!

person LondonRob    schedule 06.08.2013
comment
Довольно мило. Спасибо. О, после чего? Почти 4 года! :) - person CppLearner; 15.08.2013
comment
Это сумасшедшая вещь в онлайн-мире: он никогда не умирает! Я столкнулся с этим вопросом в совершенно обычном сеансе поиска в Google. Надеюсь, вам понравится pandas! - person LondonRob; 15.08.2013

Я поддерживаю предложение Марка. В частности, обратите внимание на DictReader из модуля csv, который позволяет читать файл, разделенный запятыми (или разделенный в целом), как словарь.

Ознакомьтесь с покрытием PyMotW модуля csv, чтобы получить краткую справку и примеры использования DictReader, DictWriter.

person Community    schedule 30.03.2010
comment
Я не понимаю, почему это получило -1 без пояснительного комментария. Что не так с предложением использовать DictReader? - person CruiZen; 06.04.2010
comment
Я должен сказать, ссылка, которую вы разместили, была весьма полезной =). Собираюсь проголосовать за это. (Мод, я полагаю, это нормально?) - person victorhooi; 18.05.2010

Вы смотрели на модуль csv?

import csv
person Mark Byers    schedule 14.12.2009
comment
Да. На самом деле у меня есть плохо написанная версия, но я понимаю, что это была головная боль, поэтому я решил сразу же сделать словарь. - person CppLearner; 14.12.2009