将CSV记录解析为类列表

时间:2013-04-04 17:16:35

标签: python parsing csv

我在StackOverflow上的第一篇文章,虽然我已经读了好几年了!

我正在使用Python来清理和分析IV曲线的CSV数据转储。

我的基本问题是数据记录器给我的格式:每隔几分钟,在单个实例中,它需要大约100次测量电压(v),电流(i)和功率(p),以及转储将它们转换为CSV文件。下一个测量将附加到此。因此,我们得到的数据结构是:

Date1;0.2;0.1;0.02
Date1;0.3;0.1;0.03
Date1;0.4;0.1;0.04
Date2;0.2;0.1;0.02
Date2;0.3;0.1;0.03
Date2;0.4;0.1;0.04
Date3; etc...

此数据存储在Data.csv文件

我写了一个名为IVCurve的课程:

class IVCurve:
    def __init__(self, datetime):
        self.datetime = datetime
    v = []
    i = []
    p = []

我想创建这些类实例的列表:

count = -1
thelist = []
prev_time = 0

import csv

with open('Data.csv', 'rb') as IVdump:
    IVdata = csv.reader(IVdump, delimiter=';')
    for datetime, v, i, p in IVdata:
        # if we're onto a new date
        if prev_time != datetime:
            # note the new record
            prev_time=datetime
            #go to the next position in thelist[]
            count +=1
            #create a new curve
            thelist.append(IVCurve(datetime))
        # in any case, put the values of v, and i into this thelist[count]
        thelist[count].v.append(float(v))
        thelist[count].i.append(float(i))
        thelist[count].p.append(float(v)*float(i))

我遇到的问题是v和i的所有值都放在list []的每个实例中,即,我得到一个IVCurve实例列表,每个实例都有不同的日期时间,但每个都有同一组v,i和p(该集合代表所有日期的整个数据集)。

我不明白我在这里做错了什么。在我看来,每次计数都增加(每当我们找到一个新的日期)时,列表[count]应该是一个新的,唯一的记录。

示例数据(我已使用此代码)我已粘贴到此处:http://pastebin.com/Dw4dd7tu

所以问题是:我如何分离值?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

问题是你有

class IVCurve:
    def __init__(self, datetime):
        self.datetime = datetime
    v = []
    i = []
    p = []

这些列表是该类的列表。因此,该类的每个实例都具有相同的列表。您希望每个实例的列表都不同,因此您应该使用__init__方法创建它们。

class IVCurve:
    def __init__(self, datetime):
        self.datetime = datetime
        self.v = []
        self.i = []
        self.p = []

答案 1 :(得分:1)

这是否能提供所需的输出?

import csv
import pprint


class IVCurve(object):
    def __init__(self, datetime, v=None, i=None):
        self.datetime = datetime
        self.v = []
        self.i = []
        self.p = []
        if v and i:
            self.add_data(v, i)

    def add_data(self, v, i):
        self.v.append(float(v))
        self.i.append(float(i))
        self.p.append(float(v) * float(i))

    def __repr__(self):
        return 'IVCurve (datetime: {}, v: {}, i: {}, p: {})'.format(
                self.datetime, self.v, self.i, self.p)


thelist = []

with open('Data.csv', 'rb') as ivdump:
    ivdata = csv.reader(ivdump, delimiter=';')
    datetime, v, i, p = next(ivdata)
    thelist.append(IVCurve(datetime, v, i))
    for datetime, v, i, p in ivdata:
        if datetime != thelist[-1].datetime:
            thelist.append(IVCurve(datetime, v, i))
        else:
            thelist[-1].add_data(v, i)

pprint.pprint(thelist)