我使用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)(忽略除零),验证将失败
答案 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))