Python中的csv文件进程

时间:2017-02-08 04:28:47

标签: python-3.x

我使用csv数据如下:

ticker,exchange_country,company_name,price,exchange_rate,shares_outstanding,net_income
1,HK,CK HUTCHISON HOLDINGS LTD,1.404816984,7.757949829,3859.677979,31633
2,HK,CLP HOLDINGS LTD,1.312602194,7.757949829,2526.450928,16319
3,HK,HONG KONG & CHINA GAS CO LTD,0.234939214,7.757949829,12717.04199,7546.200195
11,HK,HANG SENG BANK LTD,2.198193203,7.757949829,1911.843018,15451

我有一个StockStatRecord类:

class StockStatRecord:

    def __init__(self, stock_load):
        self.name = stock_load[0]
        self.company_name = stock_load[2]
        self.exchange_country = stock_load[1]
        self.price = stock_load[3]
        self.exchange_rate = stock_load[4]
        self.shares_outstanding = stock_load[5]
        self.net_income = stock_load[6]

我应该如何创建另一个类来从该CSV中提取数据,解析它,创建新记录并返回创建的记录?在这个类中,它还需要在读取时验证行。对于缺少任何信息的任何行,或者如果名称(符号或播放器名称)为空,或者如果无法解析任何数字(int或float)(忽略除零),验证将失败

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一点,或者自己推出代码,或者使用为Colander等非常有用的数据模式创建的Python模块,或者Pandas中的扩展CSV阅读器(正如Zwinck在上面的评论中所说)。

通常不需要的是一个单独的类来检查值 - 您可以在同一个类上执行此操作 - 或者通常具有实现数据验证机制的基类,然后只有每个字段的额外信息实际的数据类。最后,如果你需要处理数据并将对象溢出,则不需要类,因为在Python中你可以拥有独立于类的函数 - 没有必要尝试将每一段代码都压缩到类中。

有一个简单的事情是(1)使用Python的csv.DictReader而不是csv.Reader来读取行 - 这样你就可以将每一段数据绑定到列名,作为dict,而不是列表,您必须手动跟踪列号,然后为您需要验证的每个列设置property,以便可以在设置时验证字段 - 以及一个简单分配所有列的__init__方法字段到他们的相应属性:

class SockStatRecord:
    def __init__(self, row):
         for key, value in row.items():
               setattr(self, key, value)

    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, value):
        if not name:  # example verification for empty name
             raise ValueError
        self._name = name
    # continue for other fields

   import csv
   reader = csv.Dictreader(open("mydatafile.csv"))
   all_records = []
   for row in reader:
       try:
           all_records.append(StockDataRecord(row))
       except ValueError:
           print("Some error at record: {}".format(row))