如何高效读取CSV文件后进行高效处理?(之一:高效读取CSV格式文件)

背景简介:

现有一个文件夹,全部是CSV格式文件。需要从这些CSV文件中逐一读取第一列,取前100个和后100个组成一个二维数组,最终将这些二维数组合并成一个大的二维数组


问题解剖

可以把问题分成三大部分:

  1. 逐一读取CSV格式文件的第一列;
  2. 对每个CSV文件进行处理(取前100个和后100个,合并);
  3. 对上一步获得的的二维数组进行合并。

问题分析

问题一: (逐一)读取CSV格式文件

考虑到实际情况,可以以一个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方法而言,差距并不是很大。

因而:

更推荐使用pandas模块里的read_csv方法,如果需要将数据保存为numpy.ndarray格式文件,可以选择在后面使用pandas.DataFrame.as_matrix()方法

Reference:

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

你可能感兴趣的:(python)