python读取大文件csv_python项目实践分享:使用pandas处理大型CSV文件

9e3df8dcd100baa1458853a3314d1c14c9fc2ee1.jpeg?token=d869e27a4fd553295160e1631cd01101

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的值如下:

4e4a20a4462309f7fb032e780453a9f5d6cad6d4.jpeg?token=df5d92a817fec4df41929330e5386c71

2.csv.writer(csvfilc, dialcct='excer', **fmtparams),用于写入CSV文件。

参数同上。来看一个使用例子。

d53f8794a4c27d1eb97f405e6f880868dcc438b6.jpeg?token=706c179fa7774b38b5216394ee14a698

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),用于支持字典的写入。

4ec2d5628535e5ddffaac4bb019b02e9cf1b62b7.jpeg?token=256cecd7a204c93b7f10835ac21cad3b

csv模块使用非常简单,基本可以满足大部分需求。但你有没有思考过这个问题:有些 应用中需要解析和处理的CSV文件可能有上百MB甚至几个GB,这种情况下csv模块是否能够应付呢?先来做个实验,临时创建一个1GB的CSV文件并将其加载到内存中,看看会有什么问题发生。

4bed2e738bd4b31c4ac288abf08b82799f2ff88c.jpeg?token=5433c7c775a9685081ec33761bd02200

上面的例子中当企图读入这个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()来检测数据是否丢失。

58ee3d6d55fbb2fbe8251da7391785a24723dcd9.jpeg?token=6a259c9bbcbfca4069473aa7a42e31a0

(2)DataFrame

类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是 不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series一样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长 度相等的列表的字典来构建。构建一个DataFrame最常用的方式是用一个相等长度 列表的字典或NumPy数组。DataFrame也可以通过columns指定序列的顺序进行排序。

8b13632762d0f703779b8cc47ea7f43b2697c565.jpeg?token=db0dd8334a2fe64f5b7a980c575e2ee5

Pandas中处理CSV文件的函数主要为read_csv()和to_csv()这两个,其中read_csv()读取CSV文件的内容并返回DataFrame, to_csv()则是其逆过程。两个函数都支持多个参数, 由于其参数众多且过于复杂,我们就选取几个常见的情形结合具体例子介绍。下面举例说明.其中需要处理的CSV文件格式如下所示。

a5c27d1ed21b0ef49ad99561ab99f4dc81cb3ebb.jpeg?token=39813f3594cc07b8de78f02d39e6a9c6

a.指定读取部分列和文件的行数。

具体的实现代码如下:

0b55b319ebc4b745515b525fb9a1bb118b82150b.jpeg?token=e194ddacc1ce4d490982200a558aa7f0

方法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会直接忽略不符合要求的记录。

3812b31bb051f819b0208a89aee9efeb2f73e754.jpeg?token=6f47654c30f1732deedce0f33cbac4cd

c.对文件进行分块处理并返回一个可迭代的对象。

分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。参数chunksize设置分块的文件行数,10表示每一块 包含10个记录。将参数iterator设置为True时,返回值为TextFileReader,它是一个可迭代对象。

来看下面的例子,当chunksizc=10、iterator=True时,每次输出为包含10个记录的块。

b7003af33a87e950d89391b46565f645f9f2b4c2.jpeg?token=ed5cb72c866dae90cf1d96f6edbc37bf

当文件格式相似的时候,支持多个文件合并处理。以下例子用于将3个格式相同的文件进行合并处理。

11385343fbf2b211384c2e2fbcddc03e0dd78ed1.jpeg?token=201ff334992481fe22eb5f20dbc811d9

了解完pandas后,大家可以自行实验一下使用pandas处理前面生成的1GB的文件,看看还会不会抛出MemoryError异常。

在处理CSV文件上,特别是大型CSV文件,pandas不仅能够做到与csv模块兼容,更重要的是其CSV文件以DataFramc的格式返回,pandas对这种数据结构提供了非常丰富的 姓理方法,同时pandas支持文件的分块和合并处理,非常灵活,由于其底层很多算法采用Cython实现运行速度较快。实际上pandas在专业的数据处理与分析领域.如金融等行业已经得到广泛的应用。

d62a6059252dd42aef6144eb7566feb3c8eab8ee.jpeg?token=ac16e66e805c4258dfed6c1525165aec

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值