python xlrd pandas_python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

一、python操作excel之openpyxl

前言

根据官方文档,openpyxl 是一个第三方库, 它可以可以处理 xlsx/xlsm 格式的 Excel 文件(A Python library to read/write Excel 2010 xlsx/xlsm files)。

openpyxl 中主要的三个概念: Workbook(工作表),Sheet(表页)和Cell(格)。

openpyxl 中主要的操作: 打开 Workbook,定位 Sheet,操作 Cell。

(1)支持excel格式

xlsx

xlsm

xltx

xltm

(2)基本用法

首先介绍下Excel的一些基本概念,Workbook相当于是一个文件,WorkSheet就是文件里面的每个具体的表,比如新建Excel文件里面的'Sheet1'这个,一个Workbook里面有一个或多个WorkSheet.

workbook: 工作簿,一个excel文件包含多个sheet。

worksheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。

cell: 单元格,存储数据对象

1、安装openpyxl

pip install openpyxl

2、参数介绍

(一)常遇到的情况

就我自己来说,常遇到的情况可能就下面几种:

读取excel整个sheet页的数据。

读取指定行、列的数据

往一个空白的excel文档写数据

往一个已经有数据的excel文档追加数据

下面就以这几种情况为例进行说明。

(二) 涉及的模块及函数说明

就我知道的,有3个模块可以操作excel文档,3个模块通过pip都可以直接安装。

xlrd:读数据

xlwt:写数据

openpyxl:可以读数据,也可以写数据

这里就就只说明openpyxl了,因为这个模块能满足上面的需要了。

openpyxl函数

函数

说明

load_workbook(filename)

打开excel,并返回所有sheet页访问指定sheet页的方法:*#打开excel文档 wb = openpyxl.load_workbook(file_name)#访问sheet页 *sheet = wb[‘sheet页的名称’]#关闭excel文档wb.close()

Workbook()

创建excel文档wb = openpyxl.Workbook()#保存excel文档wb.save('文件名.xlsx')

下面的函数是针对sheet页的sheet = wb[‘sheet页的名称’]访问指定单元格的方式sheet['A1']、sheet['B1']...

min_row

返回包含数据的最小行索引,索引从1开始例如:sheet.min_row

max_row

返回包含数据的最大行索引,索引从1开始

min_column

返回包含数据的最小列索引,索引从1开始

max_column

返回包含数据的最大列索引,索引从1开始

values

获取excel文档所有的数据,返回的是一个generator对象

iter_rows(min_row=None, max_row=None, min_col=None, max_col=None)

min_row:最小行索引max_row:最大行索引min_col:最小列索引max_col:最大列索引获取指定行、列的单元格,没指定就是获取所有的

title

WorkSheet的名称

现在我有这么一个excel,下面以这个excel进行说明。

3、读取文件属性

import openpyxl

# 打开一个EXcel文档

wb = openpyxl.load_workbook('test.xlsx')

sheet2 = wb['Sheet2']

print('表名为:',sheet2.title)

print('数据的行数和列数:',sheet2.dimensions)

print('最小行数为:',sheet2.max_row)

print('最大行数为:',sheet2.min_row)

print('最大列数为:',sheet2.max_column)

print('最小列数为:',sheet2.min_column)

# 获取指定单元格

print('单元格A1:',sheet2['A1'])

print('单元格B1:',sheet2.cell(row=1, column=2))

# 获取行

print('行:',sheet2.rows)

# 获取列

print('列:',sheet2.columns)

# 获取所有的数据

print('所有的数据:',sheet2.values)

# 查看Excel文档的属性

print('是否只读:',wb.read_only)

print('文档的属性:',wb.properties)

#文档的字符集格式

print('字符集格式:',wb.encoding)

# 获取活跃的工作表

print('活跃的工作表:',wb.active)

# 获取所有的工作表

print('所有的工作表:',wb.worksheets)

# 获取所有的工作表的名称

print('输出文件所有工作表名:', wb.sheetnames)

# 根据表格名称获取worksheet对象,区分大小写

print('表名:',wb['Sheet2'])

输出结果为:

表名为: Sheet2

数据的行数和列数: A1:C8

最小行数为: 8

最大行数为: 1

最大列数为: 3

最小列数为: 1

单元格A1:

单元格B1:

行:

列:

所有的数据:

是否只读: False

文档的属性:

Parameters:

creator='小钢炮', title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2015, 6, 5, 18, 17, 20), modified=datetime.datetime(2020, 5, 7, 4, 9, 19), lastModifiedBy='xxx', category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None

字符集格式: utf-8

活跃的工作表:

所有的工作表: [, , ]

输出文件所有工作表名: ['Sheet2', 'Sheet3', '成绩表']

表名:

4、读取文件内容

import openpyxl

wb = openpyxl.load_workbook('test.xlsx')

sheet2 = wb['Sheet2']

# 获取单元格内容

# 方式一

print('方法一')

for row in sheet2.values:

print(*row)

print('=========================')

# 方式二

print('方法二')

for row in sheet2.rows:

print(*[cell.value for cell in row])

print('=========================')

# 方式三

print('方法三')

for row in sheet2.iter_rows():

print(*[cell.value for cell in row])

print('=========================')

# 方式四(最复杂,最原始)

print('方法四')

for i in range(sheet2.min_row, sheet2.max_row + 1):

for j in range(sheet2.min_column, sheet2.max_column + 1):

print(sheet2.cell(row=i,column=j).value,end=' ')

print()

输出结果为:

方法一

序号 姓名 年龄

1 发生的 25

2 浮动视 26

3 好的 27

4 经回复 28

5 好的话 29

6 套网 30

7 太温柔 31

=========================

方法二

序号 姓名 年龄

1 发生的 25

2 浮动视 26

3 好的 27

4 经回复 28

5 好的话 29

6 套网 30

7 太温柔 31

=========================

方法三

序号 姓名 年龄

1 发生的 25

2 浮动视 26

3 好的 27

4 经回复 28

5 好的话 29

6 套网 30

7 太温柔 31

=========================

方法四

序号 姓名 年龄

1 发生的 25

2 浮动视 26

3 好的 27

4 经回复 28

5 好的话 29

6 套网 30

7 太温柔 31

5、删除和创建表

import openpyxl

# 打开一个EXcel文档

wb = openpyxl.load_workbook('test.xlsx')

sheet2 = wb['Sheet2']

# 删除表

sheet1 = wb.get_sheet_by_name('Sheet1')

wb.remove_sheet(sheet1)

# 保存workbook的修改

wb.save('test.xlsx')

# 创建一个新的worksheet

wb.create_sheet('成绩表')

# 保存workbook的修改

wb.save('test.xlsx')

6、在Excel中存储学生成绩

import openpyxl

# 打开workbook

wb = openpyxl.load_workbook("成绩表.xlsx")

# #创建一个成绩表

# wb.create_sheet("学生成绩表")

#

# # 删除表

# wb.remove_sheet(wb['Sheet1'])

# 获取“学生成绩表”

score = wb["学生成绩表"]

# title = ['序号','姓名','语文','数学']

# no = range(6)

# names = ['张三','李四','王五','赵柳','田七']

# wen = [80,88,85,81,89]

# 第一行数据

score['A1'].value = '序号'

score['B1'].value = '姓名'

score['C1'].value = '语文'

score['D1'].value = '数学'

# 第二行数据

score['A2'].value = int('1')

score['B2'].value = '张三'

score['C2'].value = int('52')

score['D2'].value = int('64')

# 第三行数据

score['A3'].value = int('2')

score['B3'].value = '李四'

score['C3'].value = int('28')

score['D3'].value = int('95')

# 保存workbook

wb.save('成绩表.xlsx')

7、插入工作表内容

#coding=utf-8

import openpyxl

def process_worksheet(sheet):

# 总分所在的列

sum_column = sheet.max_column + 2

# 平均分所在的列

avg_column = sheet.max_column + 1

# 将总分和平均分保存到最后两列

for row in sheet.iter_rows(min_row=2, min_col=3):

# 单元格

score = [cell.value for cell in row]

# 总分

sum_score = sum(score)

# 平均分

avg_score = sum_score / len(score)

# 将总分和平均分保存到最后两列

sheet.cell(row=row[0].row, column=avg_column).value = avg_score

sheet.cell(row=row[0].row, column=sum_column).value = sum_score

# 设置平均分和总分的标题

sheet.cell(row=1, column=avg_column).value = "平均分"

sheet.cell(row=1, column=sum_column).value = "总分"

def main():

# 打开Excel文档

wb = openpyxl.load_workbook("成绩.xlsx")

# 获取一个工作表

sheet = wb["成绩表"]

# 把外部Excel文件(成绩表)中的sheet(成绩)插入当前Excel中

process_worksheet(sheet)

# 保存“练习.xlsx”

wb.save("练习-copy.xlsx")

if __name__ == '__main__':

main()

查看练习-copy.xlsx的数据

二、Python 读、写Excel文件(三种模块三种方式

python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别:

用xlrd和xlwt进行excel读写;

用openpyxl进行excel读写;

用pandas进行excel读写;

pandas介绍

Pandas是Python的一个数据分析包,该工具为解决数据分析任务而创建。

Pandas纳入大量库和标准数据模型,提供高效的操作数据集所需的工具。

Pandas提供大量能使我们快速便捷地处理数据的函数和方法。

Pandas是字典形式,基于NumPy创建,让NumPy为中心的应用变得更加简单。

1、xlrd模块

xlrd是用来从Excel中读写数据的,但我平常只用它进行读操作,写操作会遇到些问题。用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell)。下面举个例子,例如要打开当前目录下名为”data.xlsx”的Excel文件,选择第一张工作表,然后读取第一行的全部内容并打印出来。

#打开excel文件

data=xlrd.open_workbook('data.xlsx')

#获取第一张工作表(通过索引的方式)

table=data.sheets()[0]

#data_list用来存放数据

data_list=[]

#将table中第一行的数据读取并添加到data_list中

data_list.extend(table.row_values(0))

#打印出第一行的全部数据

for item in data_list:

print item

上面的代码中读取一行用table.row_values(number),类似的读取一列用table.column_values(number),其中number为行索引,在xlrd中行和列都是从0开始索引的,因此Excel中最左上角的单元格A1是第0行第0列。

xlrd中读取某个单元格用table.cell(row,col)即可,其中row和col分别是单元格对应的行和列。

下面简单归纳一下xlrd的用法

(1)安装xlrd模块

到python官网下载http://pypi.python.org/cmdpypi/xlrd模块安装,前提是已经安装了python 环境。

pip install xlrd

(2)使用技巧

sheet.name:sheet的名字

sheet.nrows:sheet的行数

sheet.ncols:sheet的列数

sheet.get_rows():返回一个迭代器,遍历所有行,给出每个行的值列表

sheet.row_values(index):返回某一行的值列表

sheet.row(index):返回一个row对象,可通过row[index]获取这行里的单元格cell对象

sheet.col_values(index):返回某一列的值列表

sheet.cell(row,col):获取一个cell对象(row和col都从0开始算

table = data.sheets()[0]          #通过索引顺序获取

table = data.sheet_by_index(0) #通过索引顺序获取

table = data.sheet_by_name(u'Sheet1')#通过名称获取

# 获取整行和整列的值(数组)

table.row_values(i)

table.col_values(i)

# 获取行数和列数

nrows = table.nrows

ncols = table.ncols

# 循环行列表数据

for i in range(nrows):

print table.row_values(i)

# 单元格

cell_A1 = table.cell(0,0).value

cell_C4 = table.cell(2,3).value

# 使用行列索引

cell_A1 = table.row(0)[0].value

cell_A2 = table.col(1)[0].value

# 简单的写入

row = 0

col = 0

# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

ctype = 1 value = '单元格的值'

xf = 0 # 扩展的格式化

table.put_cell(row, col, ctype, value, xf)

table.cell(0,0)  #单元格的值'

table.cell(0,0).value #单元格的值'

(3)查看文件数据

import xlrd

book = xlrd.open_workbook('练习-copy.xlsx')

sheet1 = book.sheets()[0]

nrows = sheet1.nrows

print('表格总行数:', nrows)

ncols = sheet1.ncols

print('表格总列数:', ncols)

row3_values = sheet1.row_values(2)

print('第3行的值:', row3_values)

col3_values = sheet1.col_values(2)

print('第3列的值:', col3_values)

cell_2_2 = sheet1.cell(2,2).value

print('3行3列的值',cell_2_2)

输出结果如下

表格总行数: 8

表格总列数: 3

第3行的值: [2.0, '浮动视', 26.0]

第3列的值: ['年龄', 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0]

3行3列的值 26.0

2、xlwt模块

pip install xlwt

如果说xlrd不是一个单纯的Reader(如果把xlrd中的后两个字符看成Reader,那么xlwt后两个字符类似看成Writer),那么xlwt就是一个纯粹的Writer了,因为它只能对Excel进行写操作。xlwt和xlrd不光名字像,连很多函数和操作格式也是完全相同。下面简要归纳一下常用操作

(1)xlwt常用操作

新建一个Excel文件(只能通过新建写入)

data=xlwt.Workbook()

新建一个工作表

table=data.add_sheet('name')

写入数据到A1单元格

table.write(0,0,u'呵呵')

注意:如果对同一个单元格重复操作,会引发overwrite Exception,想要取消该功能,需要在添加工作表时指定为可覆盖,像下面这样

table=data.add_sheet('name',cell_overwrite_ok=True)

保存文件

data.save('test.xls')

这里只能保存扩展名为xls的,xlsx的格式不支持

xlwt支持一定的样式,操作如下

#初始化样式

style=xlwt.XFStyle()

#为样式创建字体

font=xlwt.Font()

#指定字体名字

font.name='Times New Roman'

#字体加粗

font.bold=True

#将该font设定为style的字体

style.font=font

#写入到文件时使用该样式

sheet.write(0,1,'just for test',style)

(2)实例

import xlwt # 貌似不支持excel2007的xlsx格式

wb = xlwt.Workbook()

wb_sheet = wb.add_sheet('ddd')

wb_sheet.write(0,0,'测试内容')

wb.save('d.xls')

查看d.xls文件

3、openpyxl模块

pip install openpyxl

该模块支持最新版的Excel文件格式,对Excel文件具有响应的读写操作,对此有专门的Reader和Writer两个类,便于对Excel文件的操作。虽然如此,但我一般还是用默认的workbook来进行操作。常用操作归纳如下:

(1)openpyxl常用操作

读取Excel文件

from openpyxl.reader.excel import load_workbook

wb=load_workbook(filename)

显示工作表的索引范围

wb.get_named_ranges()

显示所有工作表的名字

wb.get_sheet_names()

取得第一张表

sheetnames = wb.get_sheet_names()

ws = wb.get_sheet_by_name(sheetnames[0])

获取表名

ws.title

获取表的行数

ws.get_highest_row()

获取表的列数

ws.get_highest_column()

单元格的读取,此处和xlrd的读取方式很相近,都是通过行和列的索引来读取

#读取B1单元格中的内容

ws.cell(0,1).value

当然也支持通过Excel坐标来读取数据,代码如下

#读取B1单元格中的内容

ws.cell("B1").value

(2)实例

import pandas as pd

from pandas import DataFrame

# df = pd.read_excel(r'练习-copy.xlsx',sheet_name='学生成绩表')

# print(df.head())

data = {

'name':['张三','李四','王五'],

'age':[11,12,13],

'sex':['男','女','未知'],

}

df = DataFrame(data)

df.to_excel('new.xlsx')

查看new.xlsx文件

4、案例

把提供的原始Excel文档中的两个表格提取到另外一个新的Excel文档中,横向排列

代码如下:

import openpyxl

import pandas

from pandas import DataFrame

wb = openpyxl.load_workbook('Live数据库及表结构.xlsx')

sheet = wb['Sheet1']

aa = []

for row1 in sheet.iter_rows(min_row=3,max_row=6):

score1 = [cell.value for cell in row1]

aa.append(score1)

df = DataFrame(aa)

df.to_excel('xgp.xlsx')

bb = []

for row2 in sheet.iter_rows(min_row=8,max_row=14):

score2 = [cell.value for cell in row2]

bb.append(score2)

df = pandas.DataFrame(bb)

book = openpyxl.load_workbook('xgp.xlsx')

with pandas.ExcelWriter('xgp.xlsx')as E:

E.book = book

E.sheets = dict((ws.title, ws) for ws in book.worksheets)

df.to_excel(E,sheet_name='Sheet1',index=False,startcol=12)

查看xgp.xlsx文件

5、总结

读取Excel时,选择openpyxl和xlrd差别不大,都能满足要求

写入少量数据且存为xls格式文件时,用xlwt更方便

写入大量数据(超过xls格式限制)或者必须存为xlsx格式文件时,就要用openpyxl了。

你可能感兴趣的:(python,xlrd,pandas)