CSV(Comma Separated Values)作为一种逗号分隔型值的纯文本格式文件,在实际应用中经常用到。
如数据库数据的导入导出、数据分析中记录的存储等。因此很多语言都提供了对CSV文件处理的模块。Python也不例外,其模块csv提供了一系列与CSV处理相关的 API。我们先来看一下其中几个常见的API:
1.reader(csvfile[,dialect='excel'][, fmtparam])
主要用于CSV文件的读取,返回一个 reader对象用于在CSV文件内容上进行行迭代。
参数csvfile,需要是支持迭代(Iterator)的对象,通常对文件(file)对象或者列表(list) 对象都是适用的,并且每次调用next。方法的返回值是字符$( string);参数dialect的默认值为excel,与excel兼容;fmtparam是一系列参数列表,主要用于需要覆盖默认的Dialect 设賞的情形。当dialect设置为excel的时候,默认Dialect的值如下:
2.csv.writer(csvfilc, dialcct='excer', **fmtparams),用于写入CSV文件。
参数同上。来看一个使用例子。
3.csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel',*args, **kwds)
同reader()方法类似,不同的是将读人的信息映射到一个字典中去,其中字典的key由fieldnames指定,该值省略的话将使用CSV文件第一行的数据作为key值 。如果读入行的字段的个数大于filednames中指定的个数,多余的字段名将会存放在restkey中,而restval主要用于当读取行的域的个数小于fieldnames的时候,它的值将会被用作剩下的key对应的值。
4.csv.DictWriter(csvfile, fieldnames, rcstval='',extrasaction='raise', dialect='excel', *args, **kwds),用于支持字典的写入。
csv模块使用非常简单,基本可以满足大部分需求。但你有没有思考过这个问题:有些 应用中需要解析和处理的CSV文件可能有上百MB甚至几个GB,这种情况下csv模块是否能够应付呢?先来做个实验,临时创建一个1GB的CSV文件并将其加载到内存中,看看会有什么问题发生。
上面的例子中当企图读入这个CSV文件的时候抛岀了 MemoryError异常。这是为什么?因为csv模块对于大型CSV文件的处理无能为力。这种情况下就需要考虑其他解决方案 了,pandas模块便是较好的选择。
Pandas即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,它不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV、HDF5、HTML等,能够提供高效的大型数据处理。其支持的两种数据结构——Series和DataFramc——是数据处理的基础。下面先来介绍这两种数据结构。
(1)Series
它是一种类似数组的带索引的一维数据结构,支持的类型与NumPy兼容。如果不指定索引,默认为0到N-1。通过obj.values()和obj.index()可以分别获取值和索引。当给Series传递一个字典的时候,Series的索引将根据字典中的键排序。如果传 入字典的时候同时重新指定了 index参数.当index与字典中的键不匹配的时候,会 出现时数据丢失的情况,标记为NaN。
在pandas中用函数isnull()和notnull()来检测数据是否丢失。
(2)DataFrame
类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是 不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series一样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长 度相等的列表的字典来构建。构建一个DataFrame最常用的方式是用一个相等长度 列表的字典或NumPy数组。DataFrame也可以通过columns指定序列的顺序进行排序。
Pandas中处理CSV文件的函数主要为read_csv()和to_csv()这两个,其中read_csv()读取CSV文件的内容并返回DataFrame, to_csv()则是其逆过程。两个函数都支持多个参数, 由于其参数众多且过于复杂,我们就选取几个常见的情形结合具体例子介绍。下面举例说明.其中需要处理的CSV文件格式如下所示。
a.指定读取部分列和文件的行数。
具体的实现代码如下:
方法read_csv()的参数nrows指定读取文件的行数,usecols指定所要读取的列的列名, 如果没有列名,可直接使用索引0、1、……、n-l。上述两个参数对大文件处理非常有用,可以避免读入整个文件而只选取所需要部分进行读取。
b.设置CSV文件与excel兼容。
dialect参数可以是string也可以是csv.Dialect的实例。 如果上图所示的文件格式改为使用"|"分隔符,则需要设置dialect相关的参数。error_bad_lines设置为False,当记录不符合要求的时候,如记录所包含的列数与文件列设置不相等时可以直接忽略这些列。下面的代码用于设置CSV文件与excel兼容,其中分隔符为 而error_bad_lines=False会直接忽略不符合要求的记录。
c.对文件进行分块处理并返回一个可迭代的对象。
分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。参数chunksize设置分块的文件行数,10表示每一块 包含10个记录。将参数iterator设置为True时,返回值为TextFileReader,它是一个可迭代对象。
来看下面的例子,当chunksizc=10、iterator=True时,每次输出为包含10个记录的块。
当文件格式相似的时候,支持多个文件合并处理。以下例子用于将3个格式相同的文件进行合并处理。
了解完pandas后,大家可以自行实验一下使用pandas处理前面生成的1GB的文件,看看还会不会抛出MemoryError异常。
在处理CSV文件上,特别是大型CSV文件,pandas不仅能够做到与csv模块兼容,更重要的是其CSV文件以DataFramc的格式返回,pandas对这种数据结构提供了非常丰富的 姓理方法,同时pandas支持文件的分块和合并处理,非常灵活,由于其底层很多算法采用Cython实现运行速度较快。实际上pandas在专业的数据处理与分析领域.如金融等行业已经得到广泛的应用。