csv 模块专门用于读取和写入 csv 文件内容

以下主要讲在 python2 中的使用,在python3中有不同的地方,我会单独指出来

一般的excel表格可以保存为csv格式,然后就可以使用 csv 模块去处理了

读取文件

读取文件通过 csv.reader() 方法
需要注意,在python2中,打开和写 csv 文件,使用 rb 和 wb
但在python3中,打开和写 csv 文件,使用 r 和 w
而且 python2 和 python3 在csv文件中遇到中文时的情况也不一样,具体见后面有关中文问题的介绍
 import csv

 f = open("tmp.csv", "rb")
# 这里获得的 csvreader 变量实际上是一个迭代器,也就是不能直接打印,需要通过for循环或者next()方法读取,且只能读取一次
csvreader = csv.reader(f)
for row in csvreader:
# 这里的 row 为一个列表,每个字段为这个列表的一个元素,注意,每个字段都是字符串类型
# 为了保证每个字段的值前后没有空字符,可以使用如下方法将其处理以后获得新的列表
new_row = []
for i in row:
new_row.append(i.strip())

写文件

写文件通过csv.writer() 方法,
如果要一次写入一行,可以使用 writerow() 方法;如果要一次写多行,可以使用 writerows()
如下例:
 f = open("tmp.csv", 'wb')
# 虽然读取出来都是字符串,但是写入时,可以是其他类,所以这里的3可以是数值,读取该文件时还是会都变成字符串
a = [["a",""],["b",""],["c",3]]
csvwriter = csv.writer(f) for i in a:
# 一次写入一行
csvwriter.writerow(i) # 一次写入多行
csvwriter.writerows([["d", 4], ["e", 5]])
f.close()

定义格式

定义格式的方法 register_dialect()
有很多格式可以定义,用的最多的是delimiter ,分隔符,默认是逗号
可以自定义其他格式:
  csv.register_dialect("mydialect", delimiter="|") 
定义一个格式,命名为mydialect,分隔符设定为 "|"
应用自定义格式的方式如下:
 # 读文件时应用,读取文件时,按 "|" 分隔
f = open("tmp1.csv","rb")
lines = csv.reader(f, "mydialect") # 写文件时应用,写文件时,按 "|" 分隔
f = open("tmp1.csv","wb")
csvwriter = csv.writer(f, "mydialect")

中文问题

无论是python2,还是python3,无论是读还是写,都会遇到中文的问题
 
在python2中
读取文件时,如果原文件不是 utf-8 的编码格式(事实上,使用excel创建的csv文件,编码格式一般为gbk),则输出来的中文类似这种格式 '\xb2\xe2\xca\xd4',可以对该字符串使用decode("gbk")解码即可获得中文信息
 
写文件时,如果内容有中文,代码不会出问题,但是写出来的文件是utf-8的编码格式,使用vim和cat一般不会出问题,但是使用excel打开时,中文会显示乱码
但是写出的该 csv 文件,使用 csv 模块打开时就可以正常显示,为utf-8的编码格式
 
如果希望写出的带中文的 csv 文件可以被 excel 正常读取,可以使用codecs模块
 import csv
import codecs f = codecs.open("tmp1.csv", "w", "utf_8_sig")
csvw = csv.writer(f)
csvw.writerows([["中国","中文"],["abc","中文"]])
7 f.close()

这种方法写的csv文件,在excel中也能正常显示中文,而且文件编码为utf-8

但是该csv文件使用csv模块打开时,会在第一个字段前加上 "\ufeff" 标记,在做字符串对比的时候需要注意这一点
>>> f = open("tmp1.csv", "r")
>>> csvr = csv.reader(f)
>>> next(csvr)
['\ufeff中国', '中文']
>>> next(csvr)
['abc', '中文']

在python3中,

读取非 utf-8 编码格式带中文的csv文件时,则直接报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

但python3中有个很好的方式来解决这个问题

python3中,open函数有一个encoding参数,可以指定文件的编码格式,注意,这是python2中没有的

所以,在读取 gbk 编码格式的 csv 文件时,可以使用如下方法
>>> f = open("tmp2.csv","r", encoding="gbk")
>>> csvr = csv.reader(f)
>>> a = next(csvr)
>>> a[0]
'中文1'
>>> a[0] == '中文1'
True

注意,这里获得的中文是不是 gbk 编码,而是 unicode 编码,可以直接和 unicode 编码的中文进行比较

 
写带中文的csv文件时,也可以使用这种方式打开
>>> f = open("tmp3.csv", "w", encoding="gbk")
>>> csvw = csv.writer(f)
>>> csvw.writer([["中文1", "中文2"],["a","中文3"]])
>>> f.close()

这里创建的tmp3.csv文件是 gbk 编码格式,可以使用excel正常查看,但可能使用vim和cat查看时是乱码

vim可以更改vimrc中的fileencodings的值,来正常查看gbk格式的中文,具体方法这里就不介绍了

事实上,如果写文件时如果open函数不添加encoding参数,上面介绍的 python2 中的写方法同样适用于 python3

csv 模块的基本使用的更多相关文章

  1. nodejs:csv模块解析

    Nodejs最大的特点就是基于事件驱动和异步并发操作.大多数人知道nodejs是用于网络后台服务的新平台,可以很方便的提供后台服务:除了用于网络开发外,其实nodejs对于线下文件并发处理也是很方便的 ...

  2. python3使用csv模块读写csv文件

    python3使用csv模块读写csv文件 读取csv文件: import csv #打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open() ...

  3. Python CSV模块处理文件读写

    下面是一个简单的csv文件 Title,Release Date,Director And Now For Something Completely Different,1971,Ian MacNau ...

  4. csv模块简单使用

    json是一种嵌套了列表与字典的格式,json包可以读取返回的json格式,json.load(html返回的对象) csv模块,用来操作csv文件, import csv #from os impo ...

  5. python csv模块的reader是一个迭代器,无法多次迭代

    在一个项目中,我需要多次遍历一个文本,该文本我是用csv.reader读取的.但后来发现,本文只对第一次循环有用,而之后的循环均为空白.经过排错后,我确定问题就出现在csv.reader()这一步.之 ...

  6. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  7. Python csv模块的使用

    1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在 ...

  8. Python CSV模块简介

    Table of Contents 1. CSV 1.1. 简介 1.2. 字典方式地读写 1.3. 其它 2. 参考资料 CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用R ...

  9. python csv 模块的使用

    python csv 模块的使用 歌曲推荐:攀登(live) csv 是用逗号分隔符来分隔列与列之间的. 1. csv的写入 1.简单的写入,一次写入一行 import csv with open(& ...

  10. CSV模块

    Python csv模块的使用 1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数 ...

随机推荐

  1. 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 状压动归

    考场上空间开大了一倍就爆0了QAQ- Code: #include<cstdio> #include<algorithm> #include<cmath> usin ...

  2. code-reading-notes--xml 解析

  3. StringUtils 的填充方法

    注意:两个参数的用空格填充,三个参数的用后面的参数填充 第一个参数要填充的字符串,第二个是需要的长度,第三个是以什么填充. 左侧填充: leftPad(): StringUtils.leftPad(S ...

  4. 关于@SuppressWarnings("unchecked")注解

    解释一: 屏蔽某些编译时的警告信息         在强制类型转换的时候编译器会给出警告        加上程序代码        @SuppressWarnings("unchecked& ...

  5. android 使用讯飞人脸识别api报错:java.lang.UnsatisfiedLinkError

    1.在做一个人脸识别的项目,使用的是讯飞的api,编辑器为AS2.0,运行时报如下错误: FATAL EXCEPTION: main                  Process: com.adm ...

  6. 我一不小心把ubuntu里的ps这样的命令删掉了,应该怎么重装呢

    sudo apt-get --reinstall install procps    

  7. mysql-5.7.10-winx64 安装

    安装ZIP中的EXE文件后,找到安装目录中的my-default.ini加入代码 1 2 3 4 5 6 #新设置的 [mysql] default-character-set=utf8 #新设置的 ...

  8. HDU 4331 Contest 4

    一个很直观的想法是,求出每个点上下左右能到达的最大长度.然后枚举其斜边...没想到过了.... 当然,题解有一个很巧妙的优化,利用树状数组,那个太巧妙了. #include<iostream&g ...

  9. HDU 4321 Contest 3

    题意:给定a和b,n,让你求b+a, b+2*a, .......b+n*a里面有多少1. 当统计第K位的时候 可以注意到 第 B+T*A 和 B+(T+2^(K+1))*A 位是相同的 那么 第K位 ...

  10. Cocos2d-x 3.0多线程异步资源载入

    Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿" ...