Python之CSV模块
1. CSV简介
CSV(Comma Separated Values)是逗号分隔符文本格式,常用于Excel和数据库的导入和导出,Python标准库的CSV模块提供了读取和写入CSV格式文件的对象。
1.1 csv.reader对象和csv文件的读取
csv.reader(csvfile,dialect='excel',**fmtparams),主要用于文件的读取,返回一个reader对象用于在csv文件内容上进行行迭代。
参数csvfile是文件对象或者list对象;dialect 用于指定csv的格式模式不同程序输出的csv格式有细微差别;fmtparams是一系列参数列表,主要用于设置特定的格式,以覆盖dialect中的格式。
csv.reader对象是可迭代对象,包含以下属性:
- csv.reader().dialect #返回其dialect
- csv.reader().line_num #f返回读入的行数
示例1:使用reader对象读取csv文件scores.csv,文件内容如下:
学号,姓名,性别,班级,语文,数学,英语
100001,小雨,女,1班,72,85,87
100002,小雪,女,2班,67,87,77
100003,小宇,男,3班,88,78,78
100004,小天,男,1班,76,87,84
100005,小军,男,3班,79,86,83
#_*_coding=utf-8
import csv
def readcsv(csvfilepath):#列表方式读取
with open(csvfilepath, 'r', newline='',encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)#创建csv.reader对象
for row in reader:
# 读取出的内容是列表格式的
print(row)
print(reader.line_num)
if __name__=='__main__':
readcsv(r'E:\2018-12-19\scores.csv')
#输出
# ['学号', '姓名', '性别', '班级', '语文', '数学', '英语']
# ['100001', '小雨', '女', '1班', '72', '85', '87']
# ['100002', '小雪', '女', '2班', '67', '87', '77']
#....(略)
#
reader对象
1.2 csv.writer对象和csv文件的写入
csv.writer(csvfile,dialect='excel',**fmtparams),主要用于把列表数据写入到csv文件。
其中参数csvfile是任何支持write()方法的对象,通常为文件对象;dialect 和fmtparams与csv.reader对象构造函数中的参数意义相同。
csv.writer对象包含以下属性和方法:
- writer.writerow(row) #方法,写入一行数据
- writer.writerows #方法,写入多行数据
- writer.dialect #只读属性,返回其dialect
示例2: 使用writer对象写入csv文件
import csv
def writecsv(csvfilepath):#列表方式写入
rows=[(100006,'小江','男','1班','','',''),(100007,'小美','女','4班','','','')]
with open(csvfilepath,'a+',newline='')as csvfile:
writer = csv.writer(csvfile,dialect='excel')
writer.writerows(rows)#写入多行
print(writer.dialect) if __name__=='__main__': writecsv(r'E:\2018-12-19\scores.csv')
writer对象
1.3 csv.DictReader对象和csv文件的读取
使用csv.reader对象从csv文件读取数据,结果为列表对象row,需要通过索引row[i]访问。如果希望通过csv文件的首行标题字段名访问,则可以使用csv.DictReader对象读取。
csv.DictReader(csvfile,fieldnames=None,restkey=None,restval=None,dialect='excel',*args,**kwds)
其中,csvfile是文件对象或list对象;fieldnames用于指定字段名,如果没有指定,则第一行为字段名;restkey和restval用于指定字段名和数据个数不一致时所对应的字段名或数据值,其他参数同reader对象。
DictReader对象属性和方法:
# 方法:
csv.DictReader().__next__()# 称之为next(reader)
# 属性:
csvreader.dialect # 解析器使用的方言的只读描述。
csvreader.line_num #返回读入的行数
csvreader.fieldnames #返回标题字段名
示例3 :使用DictReader对象读取csv文件
import csv
def readcsv2(csvfilepath):
with open(csvfilepath,newline='') as f:
f_csv = csv.DictReader(f)
for row in f_csv:
print(row['姓名'],row['班级'])
# print('fieldnames:',f_csv.fieldnames)
# print('dialect:',f_csv.dialect)
# print('line_num:',f_csv.line_num) if __name__=='__main__':
readcsv2(r'E:\2018-12-19\scores.csv')
DictReader对象
1.4 csv.DictWriter对象和csv文件的写入
csv.DictWriter(csvfile,fieldnames,restval = '',extrasaction = 'raise',dialect = 'excel',*args,**kwds)
extrasaction用于指定多余字段时的操作,其他参数同上。
DictWriter对象的属性和方法:
# 方法:
csvwriter.writerow(row) # 将row写入writer的文件对象,根据当前方言进行格式化。支持迭代
csvwriter.writerows(rows) # 将行中的所有元素写入编写器的文件对象,并根据当前方言进行格式化。支持迭代
DictWriter.writeheader() # 写入标题字段名
# 属性:
csvwriter.dialect # 使用的方言只读描述
示例4 :使用DictWriter对象写入csv文件
import csv
def writecsv2(csvfilepath):
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小鱼','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小高','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers)
f_csv.writerows(rows)
if __name__=='__main__': writecsv2(r'E:\2018-12-19\scores.csv')
DictWriter对象
1.5 csv文件格式化参数和Dialect对象
1.5.1 csv 文件格式化参数
创建reader/writer对象时,可以指定csv文件格式化命名参数。
参数说明:
delimiter 用于分隔字段的分隔符。默认为","
lineterminator 用于写操作的行结束符,默认为“'\r\n ' 。读操作将忽略此选项,它能认出跨平台的行结束符
quotechar 用于带有特殊字符(如分隔符)的字段的引用符号。默认为' " '
quoting 引用约定。可选值包括
csv.QUOTE _ ALL (引用用所有字段)
csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认
csv.QUOTE_NONNUMERIC (非数字字段)
csv.QUOTE_NON (不引用)
skipinitialspace 忽略分隔符后面的空白符。默认为False
doublequote 如何处理字段内的引用符号。如果为True ,字符串中的双引号使用" "表示;如果为False,使用转义字符escapechar指定的字符
escapechar 用于对分隔符进行转义的字符串
strict 如果为True,读入错误格式的CSV行时将导致csv.Error;默认值为False
示例5 :csv文件格式化参数示例
import csv
def writecsv3(csvfilepath):
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小南','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小风','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers,delimiter = ',',quoting = csv.QUOTE_ALL)
f_csv.writerows(rows)
if __name__=='__main__': writecsv3(r'E:\2018-12-19\scores.csv')
csv文件格式化
1.5.2 Dialect 对象
若干格式化参数可以组成Dialect对象,Dialect对象包含对应于命名格式化参数的属性。可以创建 Dialect或其派生类的对象,然后传递给reader或writer的构造函数
可以使用下列csv模块的函数,创建Dialect对象。
csv.register_dialect(name[,dialect],**fmtparams):使用命名参数,注册一个名称。
csv.unregister_dialect(name):取消注册的名称。
csv.get_dialect(name):获取注册的名称的Dialect对象,无注册时csv.Error。
csv.list_dialects():所有注册Dialect对象的列表。
另外可以使用csv模块函数,获取和设置字段的长度限制:csv.filed_size_limit([new_linit])
示例6:Dialect对象示例
import csv
def writecsv4(csvfilepath):
csv.register_dialect('mydialect',delimiter = '*',quoting = csv.QUOTE_ALL)
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小北','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小琴','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers,dialect='mydialect')
f_csv.writerows(rows)
if __name__=='__main__': writecsv4(r'E:\2018-12-19\scores.csv')
dialect对象
2. 使用pandas处理大型csv文件
2.1 pandas简介
Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,它不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV、HDF5、HTML 等,能够提供高效的大型数据处理。其支持的两种数据结构——Series 和DataFrame——是数据处
理的基础。下面先来介绍这两种数据结构。
Series:它是一种类似数组的带索引的一维数据结构,支持的类型与NumPy兼容。如果不指定索引,默认为0到N-1。通过obj.values() 和obj.index() 可以分别获取值和索引。当给Series 传递一个字典的时候,Series 的索引将根据字典中的键排序。如果传入字典的时候同时重新指定了index 参数,当index 与字典中的键不匹配的时候,会出现时数据丢失的情况,标记为NaN。在pandas 中用函数isnull() 和notnull() 来检测数据是否丢失。
import pandas >>> 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":"","Price":25},index=['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', 'East'],
... '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
2.2 pandas处理csv文件
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。上述两个参数对大文件处理非常有用,可以避免读入整个文件而只选取所需要部分进行读取。
import pandas as pd
def readcsv3(csvfilepath):
df = pd.read_csv(csvfilepath, nrows=3, usecols=['学号', '姓名','班级'],encoding='gbk')
print(df) if __name__=='__main__':
readcsv3(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 班级
# 0 100001 小雨 1班
# 1 100002 小雪 2班
# 2 100003 小宇 3班
读取指定行和列
如果出现错误提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb8
原因:含有中文字符,将encoding设置为gbk
2)设置CSV文件与excel兼容
将scores.csv文件内容修改如下:
学号,姓名,性别,班级,语文,数学,英语
100001,小雨,女,1班,72,85,87
100002,小雪,女,2班,67,87,77
100003,小宇,小白,男,3班,88,78,78
100004,小天,男,1班,76,87,84
100005,小军,男,3班,79,86,83
100006,小江,男,1班,77,79,80,44
100007,小美,女,4班,77,88,80,44
100001,小鱼,男,1班,72,82,85,33
100002,小高,女,6班,74,88,85,77
Scores.csv
下面的代码用于设置CSV 文件与excel 兼容,error_bad_lines=False 会直接忽略不符合要求的记录。
import pandas as pd
def readcsv4(csvfilepath):
dia = csv.excel()
df = pd.read_csv(csvfilepath, dialect=dia, error_bad_lines=False,encoding='gbk')
print(df) if __name__=='__main__':
readcsv4(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 性别 班级 语文 数学 英语
# 0 100001 小雨 女 1班 72 85 87
# 1 100002 小雪 女 2班 67 87 77
# 2 100004 小天 男 1班 76 87 84
# 3 100005 小军 男 3班 79 86 83
3)对文件进行分块处理并返回一个可迭代的对象
分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。参数chunksize设置分块的文件行数,2表示每一块包含2个记录。将参数iterator 设置为True时,返回值为TextFileReader,它是一个可迭代对象。
来看下面的例子,当chunksize=2、iterator=True 时,每次输出为包含2个记录的块。
import pandas as pd
def readcsv5(csvfilepath):
df = pd.read_csv(csvfilepath,encoding='gbk',chunksize=2,iterator=True)
print(df)#<pandas.io.parsers.TextFileReader object at 0x00000293FA870320>
print(iter(df).__next__()) if __name__=='__main__':
readcsv5(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 性别 班级 语文 数学 英语
# 0 100001 小雨 女 1班 72 85 87
# 1 100002 小雪 女 2班 67 87 77
>>>>>待续
Python之CSV模块的更多相关文章
- python中csv模块和join函数的使用
在看项目的时候恰好又碰到了这两个功能,然后稍微记录一下,关于join函数,是一个经常使用的联合函数,作用就是用自己规定的字符去串联字符串和列表之类的,对于字符串来说,join函数针对的是字符串中的每一 ...
- Python中csv模块解析
导入模块 import csv 2.读取csv文件 file1 = open('test1.csv', 'rb') reader = csv.reader(file1) rows = [row for ...
- python 利用csv模块导入数据
- python 内建模块与第三方模块
*)datetime模块 包括时间.时间对象.时间戳.时区.时区的转换 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/101764878 ...
- Python CSV模块处理文件读写
下面是一个简单的csv文件 Title,Release Date,Director And Now For Something Completely Different,1971,Ian MacNau ...
- python csv模块的reader是一个迭代器,无法多次迭代
在一个项目中,我需要多次遍历一个文本,该文本我是用csv.reader读取的.但后来发现,本文只对第一次循环有用,而之后的循环均为空白.经过排错后,我确定问题就出现在csv.reader()这一步.之 ...
- Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函 ...
- Python csv模块的使用
1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在 ...
- Python CSV模块简介
Table of Contents 1. CSV 1.1. 简介 1.2. 字典方式地读写 1.3. 其它 2. 参考资料 CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用R ...
随机推荐
- Spark Streaming接收Kafka数据存储到Hbase
Spark Streaming接收Kafka数据存储到Hbase fly spark hbase kafka 主要参考了这篇文章https://yq.aliyun.com/articles/60712 ...
- hdu1595find the longest of the shortest 最短路
//给一个无向图,问删除一条边,使得从1到n的最短路最长 //问这个最长路 //这个删除的边必定在最短路上,假设不在.那么走这条最短路肯定比其它短 //枚举删除这条最短路的边,找其最长的即为答案 #i ...
- java面向接口编程
在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...
- springboot 异常: Requested bean is currently in creation: Is there an unresolvable circular reference?
2018-07-31 11:56:18.812 WARN 10316 --- [ main] ConfigServletWebServerApplicationContext : Exception ...
- 【BZOJ 1601】 灌水
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1601 [算法] 最小生成树 [代码] #include<bits/stdc++ ...
- 3.3 文件I/O
错误的解决方法请参考:http://liangruijun.blog.51cto.com/3061169/673776 3.3.2 访问手机中的存储文件夹 3.3.3 读取assets中的文件 pac ...
- 3.朴素贝叶斯和KNN算法的推导和python实现
前面一个博客我们用Scikit-Learn实现了中文文本分类的全过程,这篇博客,着重分析项目最核心的部分分类算法:朴素贝叶斯算法以及KNN算法的基本原理和简单python实现. 3.1 贝叶斯公式的推 ...
- chapter6 数据结构基础之习题 Parentheses Balance
You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...
- js动态追加的元素如何触发事件
一般通过js或者jQuery动态添加的元素标签,通过该元素标签.class.id触发事件,是无效的.如下所示: <body> <input type="text" ...
- Windows phone开发之文件夹与文件操作系列(一)文件夹与文件操作
Windows phone7中文件的存储模式是独立的,即独立存储空间(IsolatedStorage).对文件夹与文件操作,需要借助IsolatedStorageFile类. IsolatedStor ...