第二招:用nametuple
上面的第一招其实是最简单的,下面我们用nametuple 来包裹一下这个生成的row数据。
- nametuple其实是一个非常有用的类,这个类属于collections模块,而这个模块简直就是一个百宝箱里面有非常多的牛逼的库;
- 这里我们用next(f_csv)其实就是获取表格的头部来初始化这个Row;
- 然后循环来构造这个Row的数据,把我们表格里面的每一行的数据都喂成nametuple格式的row_info;
- 这样做的好处就是你可以随心所欲的访问这个row_info里面的数据,就想访问类数据一样,比如row_info.price
第三招:用tuple类型转换
如果我们对csv数据每一行的类型都非常清楚的话,嘿嘿可以用一个设定好的数据格式转换头来对数据进行转换。
操作的步骤其实跟上面差不多,就是对数据结果的清洗处理稍微不一样。这里非常巧妙的zip来构造一个嵌套的数据列表,然后用convert(data)把csv文件里面每一行的数据进行类型转换,这招真的不错!
看一下结果:
第四招:用DictReader
上面用的nametuple其实也是一个数据的映射,有没有什么方法可以直接把csv 的内容用映射的方法读取,直接出来一个字典,还真有的,来看一下代码:
是不是非常简捷,原来csv模块直接内置了DictReader(),按照字典的方法进行读取,然后生成一个有序的字典,看一下结果:
有兴趣的可以看一下这个DictReader()的源码,它其实一个内部构造的迭代器类,在内部的__next__其实也是用的OrderedDict(zip(self.fieldnames, row))来生成的。
第五招:用字典转换
如果我们需要对这个csv里面的数据进行清洗,因为读出来的时候都是字符串,我们需要更新为特定的数据类型,这个时候也可以用字典转换这一招,也是非常巧妙的,我们看一下源码:
原来的数据价格Price和成交量,我希望最后读取生成的是一个浮点型数据和整形的数据,这么搞呢,用一个字典来巧妙的更新key即可。
- 首先我们声明一个自定义的类型转换器field_types;
- 然后循环生成一个可迭代的对象(key,conversion(row[key]);
- 最后更新一下字典里面相同的key,比如row[‘price’]的内容就会被更新了