Python 数据持久化操作——CSV、Excel
CSV
如何读取CSV
# 读CSV
import csv
#打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文 件,只能用open()
with open("./csv/销售相关企业信息.csv","r") as csvfile:
#读取csv文件,返回的是迭代类型
read = csv.reader(csvfile)
for i in read:
print(i)
如何写入CSV
# 写CSV
import csv
with open('./csv/csvtest.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
#单行写入
writer.writerow(['id', 'url', 'keywords'])
#封装数据
data = [
('1', 'http://www.xiaoheiseo.com/', '小黑'),
('2', 'http://www.baidu.com/', '百度'),
('3', 'http://www.jd.com/', '京东')
]
#多行写入(注意这里是.writerows而不是.writerow!)
writer.writerows(data)
Excel
利用xlrd模块来操作Excel
实例演示
import xlrd # 导入xlrd模块
# 读取本地excel文件
myWorkbook = xlrd.open_workbook('./excel/某公司贸易数据.xlsx’) #打开excel文件(默认是rb方式打开)
mySheets = myWorkbook.sheets() # 获取excel工作表
# 获取工作表
#mySheet = mySheets[0] # 通过索引获取
#mySheet = myWorkbook.sheet_by_index(1) #通过索引顺序获得
mySheet = myWorkbook.sheet_by_name(u'产品类别') #通过名字获取
# 获取行数和列数
nrows = mySheet.nrows
ncols = mySheet.ncols
print("The rows: %d" % nrows)
print("The cols: %d" % ncols)
# 读取单元格数据
for i in range(nrows):
for j in range(ncols):
mycell = mySheet.cell(i, j) #获取单元格,i是行数,j是列数,行数和列数都是从0开始计数
mycellvalue = mycell.value #通过单元格获取单元格数据
print(mycellvalue)
mycellvalue = mySheet.cell_value(0, 0) #直接获取单元格数据'‘’
#mySheet.cell_value(0, 0) = “newValues”# 改变i,j值则改变单元格
print(mycellvalue)
利用 xlwt 模块 写入excel文件
一般在Python中主要更常见一种做法是利用xlrd模块来读取Excel文件内容, 利用xlwt模块来写入Excel文件内容
实例演示
import xlwt # 导入xlwt模块
wbk = xlwt.Workbook() # 创建工作簿
sheet = wbk.add_sheet(‘表01’) # 创建工作表
sheet.write(0,1,'test text’) # 第1行第2列写入内容
#这一行代码中.write(0,1,'tset text') 0是行(row)坐标;1是列(col)坐标,可以用变量替换他们,
#便于在循环等方式中指定写入位置
wbk.save(‘./excel/test.xls’) # 保存 Excel 文件
print("ok")
xlutils结合xlrd操作Excel
为了更方便的读写 Excel文件,在实际操作中,还有一种更加 常见的方式是:利用 xlutils模块结合 xlrd 共同操作 Excel !
实例演示
import xlrd
from xlutils.copy import copy
workbook = xlrd.open_workbook('./excel/某公司贸易数据.xlsx')
workbooknew= copy(workbook)
ws = workbooknew.get_sheet(0) #xlutils中获取sheet的方法,与xlrd中不同,但又看起来很像这里容易记混
ws.write(3, 0, 'changed!') #这个写入操作与xlwr中是一样的
workbooknew.save('./excel/test0.xls')
利用openpyxl操作Excel
实例演示*
# openpyxl可以对excel文件进行读写操作
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.writer.excel import ExcelWriter
workbook_ = load_workbook(u"./excel/某公司贸易数据.xlsx")
sheetnames = workbook_.get_sheet_names() # 获得表单名字列表 .经实际运行:get_sheet_names()属于过时写法,应该使用workbook_.sheetnames(没有括号跟随)
print(sheetnames)
sheet = workbook_.get_sheet_by_name(sheetnames[0]) #这里要注意一下openpyxl模块获取表单的方法名,这跟xlrd还是很像容易混淆,经实际运行:gei_sheet_by_name()属于过时写法,应该使用workbook_[sheetnames[0]]
print(sheet.cell(row=3, column=3).value)
sheet['A1'] = '47' #openpyxl的单元格引用方式很友好,接近微软的单元格命名方式
workbook_.save(u"./excel/test1xlsx")
常用模块的对比
这几种模块在使用方法上其实是大同小异的
无论读写,都有以下几个步骤
(以下所说“工作表”是指整个表格文件,由各个“表单”构成)
打开或创建文件->获取所有或者需要操作的表单->获取单元格->对目标单元格进行操作下面根据这几个步骤对比各个模块的异同
按步骤对比各个模块的异同
打开或创建文件
xlrd
xlrd.open_workbook(“这里传入文件路径”)
xlwt
xlwt.workbook()#这里是创建一个新的工作表,是方法,所以必须用()
xlutiles
copy(workbook_opened)#拷贝一个已将打开的工作表
openpyxl
load_workbook(“这里传入文件路径”)#在从openpyxl模块导入load_workbook方法后,直接可以使用!获取所有或者所需要的表单
xlrd
openedWorkBook.sheets()#这里openedWorkBook代表上个步骤中打开了的工作表,注意结尾的s,这里获>取到的是所有表单
openedWorkBook.sheets()[“这里是索引”]#上句话的结果,直接使用下标索引引用它,注意是[]
openedWorkBook.sheet_by_index(“这里是索引”)#测试后补充这个顺序的意义:经过测试,这里就是索引,与其他下标无异
opendWorkBook.sheet_by_name(“这里是表单名”)
#可以看出xlrd 模块有两类获取表单方法,第二类的命名是.sheet_by_”index或者name”
xlwt
createdWorkBokk.add_sheet(“这里写表单名字”)#这里createdWorkBook代表上个步骤中创建好的工作表
xlutiles
copiedWorkBook.get_sheet(“此处传入索引,int类型!”)#直接传入表单索引即可,注意是()不是[]
openpyxl
loadedWorkBook.get_sheet_names()#首先获取所有表单的名字的列表(或元组类型待核实)
loadedWorkBook.get_sheet_by_name(sheetnames[索引])#注意这里的括号的类型,只有表单索引的是[]
#这里应该注意到,openpyxl模块通过表单名字获取表单而且命名是get_sheet_by_name()是所有模块中最长的,跟xlrd的命名很像!经过实际运行:openpyxl 更新后使用了更简洁办法,工作表对象有一个属性“.sheetnames”,直接调用此属性即可满足需求!而获取单个表单的方法则变成了wb[sheetname](直接饮用文档写法)获取单元格
xlrd
targetSheet.cell(row,col)#如此获取的是单元格对象,若要使用它的值应使用它的.value属性
targetSheet.cell_vaulue(row,col)#也可以使用.cell_value()方法直接取得所需单元格数值,由于xlrd模块默认打开文件是只读打开,故而以上两种方式访问单元格均不可以对单元格内容进行改变
xlwt
targeiSheet.write(row,col,value_to_write)#在xlwt模块中,直接传入想要写入内容的单元格的坐标即可访问想要访问的单元格,并完成写入操作
xlutiles
targetSheet.write(row,col,value_to_write)#xlutiles的写入与xlwt一样
openpyxl
targetSheet.cell(row=这里写行坐标,column=这里写列坐标,).value#这种访问方法与xlrd类似
targetSheet[’这里是单元格名称‘]#单元格名称与excel中的格式一样,str类型,所以要记得引号!对目标单元格进行操作
xlrd
多用于读取单元格的值
xlwt
用于写入值
xlutiles
用于与xlrd配合,完成读写操作,可以对已有工作表进行复制,并能对复制后的工作表进行写入操作!即可以对已有表格做修改后的备份
这里比xlwt的单纯写空表强大了许多
openpyxl
读写全能,命名符合excel用户的习惯
由于其命名格式,在python中可以考虑使用字符串和格式字配合,组装成单元格名,方便变量使用,
易于实现批量操作
openpyxl不支持.xls格式,只支持.xlsx,如果不注意会报错