建议42:使用pandas处理大型CSV文件
# -*- coding:utf-8 -*-
'''
CSV 常用API 1)reader(csvfile[, dialect='excel'][, fmtparam]),主要用于CSV 文件的读取,返回一个
reader 对象用于在CSV 文件内容上进行行迭代。
参数:
csvfile,需要是支持迭代(Iterator)的对象,通常对文件(file)对象或者列表(list)对象都是适用的,并且每次调用next() 方法的返回值是字符串(string);
dialect 的默认值为excel,与excel 兼容;
fmtparam 是一系列参数列表,主要用于需要覆盖默认的Dialect设置的情形 2)csv.writer(csvfile, dialect='excel', **fmtparams),用于写入CSV 文件。 with open('data.csv', 'wb') as csvfile:
csvwriter = csv.writer(csvfile, dialect='excel',delimiter="|",quotechar='"',
quoting=csv.QUOTE_MINIMAL)
csvwriter .writerow(["1/3/09 14:44","'Product1'","1200''","Visa","Gouya"])
# 写入行
输出形式为: 1/3/09 14:44|'Product1'|1200''|Visa|Gouya 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, restval='', extrasaction='raise',
dialect='excel', *args,**kwds),用于支持字典的写入。 '''
import csv
#DictWriter
with open('C:\\test.csv', 'wb') as csv_file:
# 设置列名称
FIELDS = ['Transaction_date', 'Product', 'Price', 'Payment_Type']
writer = csv.DictWriter(csv_file, fieldnames=FIELDS)
# 写入列名称
writer.writerow(dict(zip(FIELDS, FIELDS)))
d = {'Transaction_date':'1/2/09 6:17','Product':'Product1','Price':'',\
'Payment_Type':'Mastercard'}
# 写入一行
writer.writerow(d) with open('C:\\test.csv', 'rb') as csv_file:
for d in csv.DictReader(csv_file):
print d '''
Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,,它
不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV、HDF5、HTML 等,
能够提供高效的大型数据处理。其支持的两种数据结构——Series 和DataFrame——是数据处
理的基础。下面先来介绍这两种数据结构。 Series:它是一种类似数组的带索引的一维数据结构,支持的类型与NumPy 兼容。如
果不指定索引,默认为0 到N-1。通过obj.values() 和obj.index() 可以分别获取值和索
引。当给Series 传递一个字典的时候,Series 的索引将根据字典中的键排序。如果传
入字典的时候同时重新指定了index 参数,当index 与字典中的键不匹配的时候,会
出现时数据丢失的情况,标记为NaN。 import pandas
#在pandas 中用函数isnull() 和notnull() 来检测数据是否丢失。 >>> obj1 = Series([1, 'a', (1,2), 3], index=['a', 'b', 'c', 'd'])
>>> obj1#value 和index 一一匹配
a 1
b a
c (1, 2)
d 3
dtype: object
>>> obj2=Series({"Book":"Python","Author":"Dan","ISBN":"011334","Price":25},inde
x=['book','Author','ISBM','Price'])
>>> obj2.isnull()
book True # 指定的index 与字典的键不匹配,发生数据丢失
Author False
ISBM True # 指定的index 与字典的键不匹配,发生数据丢失
Price False
dtype: bool DataFrame :类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是
不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series 一
样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长
度相等的列表的字典来构建。构建一个DataFrame 最常用的方式是用一个相等长度
列表的字典或NumPy 数组。DataFrame 也可以通过columns 指定序列的顺序进行
排序。 >>> data = {'OrderDate': ['1-6-10', '1-23-10', '2-9-10', '2-26-10', '3-15-10'],
... 'Region': ['East', 'Central', 'Central', 'West', 'E ast'],
... 'Rep': ['Jones', 'Kivell', 'Jardine', 'Gill', 'Sorv ino']}
>>>
>>> DataFrame(data,columns=['OrderDate','Region','Rep'])# 通过字典构建,按照cloumns 指定的顺序排序
OrderDate Region Rep
0 1-6-10 East Jones
1 1-23-10 Central Kivell
2 2-9-10 Central Jardine
3 2-26-10 West Gill
4 3-15-10 East Sorvino #Pandas 中处理CSV 文件的函数主要为read_csv() 和to_csv() 这两个,其中read_csv() 读取CSV 文件的内容并返回DataFrame,to_csv() 则是其逆过程。 1)指定读取部分列和文件的行数。具体的实现代码如下:
df = pd.read_csv("SampleData.csv",nrows=5,usecols=['OrderDate','Item','Total']) 方法read_csv() 的参数nrows 指定读取文件的行数,usecols 指定所要读取的列的列名,
如果没有列名,可直接使用索引0、1、...、n-1。上述两个参数对大文件处理非常有用,可
以避免读入整个文件而只选取所需要部分进行读取 2)设置CSV 文件与excel 兼容。dialect 参数可以是string 也可以是csv.Dialect 的实例。
如果将图4-2 所示的文件格式改为使用“ |”分隔符,则需要设置dialect 相关的参数。error_
bad_lines 设置为False,当记录不符合要求的时候,如记录所包含的列数与文件列设置不相
等时可以直接忽略这些列。下面的代码用于设置CSV 文件与excel 兼容,其中分隔符为“| ”,
而error_bad_lines=False 会直接忽略不符合要求的记录。 >>> dia = csv.excel()
>>> dia.delimiter="|" #设置分隔符
>>> pd.read_csv("SD.csv")
OrderDate|Region|Rep|Item|Units|Unit Cost|Total
0 1-6-10|East|Jones|Pencil|95|1.99 |189.05
1 1-23-10|Central|Kivell|Binder|50|19.99 |999.50...
>>> pd.read_csv("SD.csv",dialect = dia,error_bad_lines=False)
Skipping line 3: expected 7 fields, saw 10 # 所有不符合格式要求的列将直接忽略
OrderDate Region Rep Item Units Unit Cost Total
0 1-6-10 East Jones Pencil 95 1.99 189.05 3)对文件进行分块处理并返回一个可迭代的对象。分块处理可以避免将所有的文件载入
内存,仅在使用的时候读入所需内容。参数chunksize 设置分块的文件行数,10 表示每一块
包含10 个记录。将参数iterator 设置为True 时,返回值为TextFileReader,它是一个可迭代对
象。来看下面的例子,当chunksize=10、iterator=True 时,每次输出为包含10 个记录的块。
>>> reader = pd.read_table("SampleData.csv",chunksize=10,iterator=True)
>>> reader
<pandas.io.parsers.TextFileReader object at 0x0314BE70>
>>> iter(reader).next() # 将TextFileReader 转换为迭代器并调用next 方法
OrderDate,Region,Rep,Item,Units,Unit Cost,Total # 每次读入10 行
0 1-6-10,East,Jones,Pencil,95, 1.99 , 189.05
1 1-23-10,Central,Kivell,Binder,50, 19.99 , 999.50
2 2-9-10,Central,Jardine,Pencil,36, 4.99 , 179.64
3 2-26-10,Central,Gill,Pen,27, 19.99 , 539.73
4 3-15-10,West,Sorvino,Pencil,56, 2.99 , 167.44
5 4-1-10,East,Jones,Binder,60, 4.99 , 299.40
6 4-18-10,Central,Andrews,Pencil,75, 1.99 , 149.25
7 5-5-10,Central,Jardine,Pencil,90, 4.99 , 449.10
8 5-22-10,West,Thompson,Pencil,32, 1.99 , 63.68 4)当文件格式相似的时候,支持多个文件合并处理。以下例子用于将3 个格式相同的
文件进行合并处理。 >>> filelst = os.listdir("test")
>>> print filelst # 同时存在3 个格式相同的文件
['s1.csv', 's2.csv', 's3.csv']
>>> os.chdir("test")
>>> dfs =[pd.read_csv(f) for f in filelst]
>>> total_df = pd.concat(dfs) # 将文件合并
>>> total_df
OrderDate Region Rep Item Units Unit Cost Total
0 1-6-10 East Jones Pencil 95 1.99 189.05
1 1-23-10 Central Kivell Binder 50 19.99 999.5 '''
建议42:使用pandas处理大型CSV文件的更多相关文章
- 使用Ruby处理大型CSV文件
处理大型文件是一种内存密集型操作,可能导致服务器耗尽RAM内存并交换到磁盘.让我们看一下使用Ruby处理CSV文件的几种方法,并测量内存消耗和速度性能. Prepare CSV data sample ...
- [译]使用Pandas读取大型Excel文件
上周我参加了dataisbeautiful subreddit上的Dataviz Battle,我们不得不从TSA声明数据集创建可视化.我喜欢这种比赛,因为大多数时候你最终都会学习很多有用的东西. 这 ...
- Python 从大型csv文件中提取感兴趣的行
帮妹子处理一个2.xG 大小的 csv文件,文件太大,不宜一次性读入内存,可以使用open迭代器. with open(filename,'r') as file # 按行读取 for line in ...
- 用pandas库对csv文件中的文本数据进行分析处理
#数据分析 import pandas import csv old_path = r'd:\2000W\200W-400W.csv' f = open(old_path,'r',encoding=' ...
- 利用pandas随机切分csv文件
把数据集随机切分为训练集和测试集 method 1: df = pd.read_csv('data/tgnb_merge.csv', encoding='utf-8') df.drop_duplica ...
- 使用Pandas读取大型Excel文件
import os import pandas as pd HERE = os.path.abspath(os.path.dirname(__file__)) DATA_DIR = os.path.a ...
- [Python]-pandas模块-CSV文件读写
Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,它不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV.HDF5.HTML 等 ...
- Python之文件读写(csv文件,CSV库,Pandas库)
前言 一.Python文件读取 二.读取CSV文件 一.Python文件读取 1. open函数是内置函数之with操作 - 关于路径设置的问题斜杠设置成D:\\文件夹\\文件或是D:/文件夹/文件 ...
- 109.大型的csv文件的处理方式
HttpResponse对象将会将响应的数据作为一个整体返回,此时如果数据量非常大的话,长时间浏览器没有得到服务器的响应,就会超过默认的超时时间,返回超时.而StreamingHttpResponse ...
随机推荐
- 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
/** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...
- sessionstorage:本地临时存储
HTML5 web存储有两个重要对象: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储(关闭窗口,存储的数据清空) 一般涉 ...
- freemark 页面静态化
1. 页面静态化是什么? 页面静态化有非常多含义,在WEB开发中.静态网页一般理解为站点中大部分超级链接所引用的页面是单独的HTML静态页面文件(如.htm..html等页面文件,html语言本身是静 ...
- echarts Y轴刻度保留几位小数
yAxis: [ { type: 'value', name: '雨量(mm)', nameLocation: 'start', inverse: true, axisLabel: { ...
- Chai.js断言库API中文文档【转载】
基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...
- Gallery学习————检测手机中是否存在外部存储设备
在缓存数据的时,有时候会出现没有外部存储设备的情况,所以需要检测是否存在外部存储设备 /** * 检测外部存储设备 * * @param requireWriteAccess * @return */ ...
- 【BZOJ4898】[Apio2017]商旅 分数规划+SPFA
[BZOJ4898][Apio2017]商旅 Description 在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴.你被这个城市发达而美丽的市场所深深吸引,决定定居于此,做一个 ...
- SharePoint解决方案及开发系列(2)-ECM
很多次跟客户做咨询及沟通的时候,客户都问SharePoint能做什么?是不是就是做文档管理?为什么要花那么多的钱没SharePoint?高大上? 我上家公司面试的时候,我的那个BOSS面试官有一个问题 ...
- Springboot 热部署中存在冲突的问题
SpringBoot热部署有2中: 1.使用 Spring Loaded 2.使用 spring-boot-devtools 具体怎么用.自己百度! 在使用第一种时候,整合SpringBoot和通用M ...
- 解决 request.getInputStream() 只能获取一次body的问题
问题: 在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数 ...