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. Python3.7中的常用关键字

    本文是在学习Python中遇到的一些关键字,作为日常总结的笔记. Python中有保留字/关键字 保留字就是在Python中预先保留的标识符,这些标识符在Python程序中具有特定用途,不能被程序员作 ...

  2. 使用jq把js代码封装一个自己的插件

    为什么要把js功能封装成插件呢?我觉得有以下几点吧 1.最基本的原因就是便于代码复用. 2.便于维护和管理. 3.提升自身的能力. 4.避免各个相同功能组件的干扰,以及一些作用域会相互影响的问题. j ...

  3. PAT 天梯赛练习集 L2-016. 愿天下有情人都是失散多年的兄妹

    题目链接:https://www.patest.cn/contests/gplt/L2-016 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母. ...

  4. linux内存随笔

    内存在电脑中使用广泛,比如内存条内存.显卡显存.cpu缓存.raid卡缓存等,缓存就是数据交换的缓冲区(称作cache),缓存往往都是RAM(断电文件丢失),他们的读写速率非常高,用来帮助硬件更快的响 ...

  5. Python学习笔记(7)字典

    2019-03-07 字典(dict): (1)字典用大括号({})定义,字典由多个键及其对应的值组合而成,每一对键值组合称为项. (2)字典的键唯一,但是值可以是任何(不可变的)数据类型(整型,字符 ...

  6. CRM系统 - 总结 (二) stark组件

    介绍: stark组件,是一个帮助开发者快速实现数据库表的增删改查+的组件.目标: 10s 中完成一张表的增删改查. 前戏: django项目启动时,自定义执行某个py文件. django启动时,且在 ...

  7. 利用已有库对excel进行读和写

    读excel的内容:libxls库 C: https://github.com/evanmiller/libxls  或 http://libxls.sourceforge.net/ 参考博客:htt ...

  8. Vue轮播图插件---Vue-Awesome-Swiper

    轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...

  9. mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)

    full index scan:全索引扫描,查询时,遍历索引树来获取数据行.如果数据不是密集的会产生随机IO 在执行计划中是Type列,index full table scan:通过读物理表获取数据 ...

  10. 工具-WIN7-内存占用过高解决办法

    我的WIN7内存竟然吃到了7.6G,太不可思意了 第一步 看看网上的解决办法 http://jingyan.baidu.com/article/870c6fc31060eab03fe4beee.htm ...