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. day03 Python3的安装

    目录 Python的安装 Python下载 Python3安装 环境变量 添加环境变量 在CMD中运行Python Python的安装 Python可在多个操作系统(Windows,Linux,Mac ...

  2. getattibute 与 getparameter区别

    1.getAttribute是取得jsp中 用setAttribute设定的attribute 2.parameter得到的是string:attribute得到的是object  3.request ...

  3. Codeforces Round #499 (Div. 2) C.FLY 数学推导_逆推

    本题应该是可以使用实数二分的,不过笔者一直未调出来,而且发现了一种更为优美的解法,那就是逆推. 首先,不难猜到在最优解中当飞船回到 111 号节点时油量一定为 000, 这就意味着减少的油量等于减少之 ...

  4. vue封装http请求

    import axios from 'axios' import isObject from 'lodash/isObject' const http = function (api, data = ...

  5. (1)安装vagrant和virtualbox

    使用xshell,学校服务器需要先联外网. 1.安装Linux头包(linux-header package): # #yum install kernel-devel 2.安装virtualbox. ...

  6. NOIP 2017 时间复杂度 (模拟)

    题目大意:略 傻了吧唧的我wa了好几次 我的模拟功底真的不咋地 linux下用gets会报错,我用的fgets #include <string> #include "stdio ...

  7. IDEA快速搭建 SpringCloud 注册中心与

    第一步:创建 注册中心(eureka)项目 按照以下步骤一步一步来(只是对于IDEA的初学者来说) (我这里选择maven项目.比较方便) 给注册中心项目 取上可爱的名称 第二步配置 eureka的p ...

  8. CSS变量实用指南及注意事项

    近年来,一些动态特性已经开始成为 CSS 语言本身的一部分. CSS变量 – 官方的术语为 "自定义属性" – 已经已经加入规范并且具有很好的浏览器支持,而 CSS mixins ...

  9. bitset优化背包

    题目:https://agc020.contest.atcoder.jp/tasks/agc020_c 回忆下一题,是零一背包,主要的做法就是凑出最接近sum/2的价值,然后发现现在的背包的容量是20 ...

  10. 常用的ES6方法

    常用的ES6方法 ES6之后,新增了定义变量的两个关键字,分别是let和const. let和const都能够声明块级作用域,用法和var是类似的,let的特点是不会变量提升,而是被锁在当前块中. 实 ...