现有一个文件夹,全部是CSV格式文件。需要从这些CSV文件中逐一读取第一列,取前100个和后100个组成一个二维数组,最终将这些二维数组合并成一个大的二维数组
考虑到实际情况,可以以一个CSV文件为例进行说明。逐一读取多个同一路径下的文件可以考虑使用glob模块的iglob方法,这里不废话。
目前,Python3(以下简称Python)至少有三种办法读取CSV格式文件,分别是:
1.csv模块
2.numpy里面的loadtxt方法
3.pandas里面的read_csv方法
这里采用time模块里的timeit计时模块,测试机器的CPU为i7 6820HQ,16G内存,搭载windows10 64位系统。
由于csv.reader方法是把每一行数据转化成了一个list,list中每个元素是一个字符串,并不能(或者说很难)满足我们的需求(可以间接实现我们的需求,后面有机会再补充),因而这里只比较numpy模块的方法和pandas模块的方法。由于pandas方法效率比较高,故而增加pandas模块读取后转存为numpy.ndarray格式文件的测试。
测试代码块示例如下:
import timeit
import numpy
import pandas
def func_numpy():
filepath = r'csv filepath'
numpy.loadtxt(filepath, usecols=[0], delimiter=',')
def func_pandas():
filepath = r'csv filepath'
pandas.read_csv(filepath, usecols=[0])
def fun_pandas2numpy():
filepath = r'csv filepath'
pandas.read_csv(filepath, usecols=[0]).as_matrix()
# 开始计时
t_numpy = timeit.timeit('func_numpy()', 'from __main__ import func_numpy', number=100)
t_pandas = timeit.timeit('func_pandas()', 'from __main__ import func_pandas', number=100)
t_pandas2numpy = timeit.timeit('fun_pandas2numpy()', 'from __main__ import fun_pandas2numpy', number=100)
print('读取100次,numpy模块loadtxt方法用时:', t_numpy)
print('读取100次,pandas模块read_csv方法用时:', t_pandas)
print('读取100次,pandas模块read_csv方法读取后并将其转化为ndarray格式文件用时:', t_pandas2numpy)
运行结果如下:
读取100次,numpy模块loadtxt方法用时: 75.16465592171689
读取100次,pandas模块read_csv方法用时: 6.334802627057911
读取100次,pandas模块read_csv方法读取后并将其转化为ndarray格式文件用时: 5.922901347888825
需要指出的是pandas模块read_csv方法和pandas模块read_csv方法读取后并将其转化为ndarray格式文件的前后顺序对运行结果会有影响(哪个在前面哪个的时间会略慢,请大佬批评指正)。但是这两种方法相比较numpy方法而言,差距并不是很大。
http://www.cnblogs.com/liujinhong/p/5937527.html
http://www.cnblogs.com/PrettyTom/p/6657984.html
https://tieba.baidu.com/p/3773675591?red_tag=2052930145
http://www.cppblog.com/huyutian/articles/211535.html?opt=admin
http://blog.csdn.net/u013713117/article/details/54587555