一、xlrd
二、xlwt
三、openyxl
四、numpy
五、pandas
openpyxl
1. 简介
openpyxl模块是一个读写Excel2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl能够同时读取和修改Excel文档
2. 安装和引用
pip install openpyxl
from openpyxl import load_workbook, Workbook
3. Workbook对象
3.1 创建Workbook对象
excel = openpyxl.Workbook() 会创建新的excel时会默认创建一个sheet
excel = openpyxl.load_workbook("hello.xlsx") 导入已经存在的excel
3.2 Workbook对象的方法
方法 | 解释 | 例子 | 结果 |
get_sheet_names | 获取所有表格的名称,新版已不适用 | ||
get_sheet_by_name | 通过表格名称获取worksheet对象,新版已不适用 | ||
get_active_sheet | 获取活跃的表格,新版已不适用 | ||
通过表格名称获取worksheet对象 | excel['sheetname'] | ||
remove_sheet('sheet') | 删除一个表格 | excel.remove_sheet(excel["mysheet"]) | 参数为sheet对象 |
create_sheet(title,index) | 创建一个空的表格,index=0插入到开头 | excel.create_sheet('ghk',0) | index表示插入表格的位置 |
copy_worksheet('sheet') | 在workook内拷贝表格 | excel.copy_worksheet(excel["mysheet"]) | 只能在一个excel里复制,不能跨excel复制 |
active | 获取当前活跃的Worksheet | excel.active | 没有则返回None,有则返回Worksheet对象-<Worksheet "abc"> |
worksheets | 以列表形式返回所有worksheet | excel.worksheets | [<Worksheet "abc">, <Worksheet "def">] |
read_only | 判断是否以只读形式打开 | excel.read_only | False |
encoding | 获取文档的字符集编码 | excel.encoding | 'utf-8' |
properties | 获取文档的源数据,标题作者等 | excel.properties |
|
sheetnames | 获取工作簿中的表(列表) | excel.sheetnames | ['abc','def'] |
4.Worksheet对象
4.1获取Worksheet对象
sheet = excel.get_sheet_by_name("Sheet1") ---【注:包的新版本已不再适用】 或
sheet = excel["Sheet1"] 或
sheet = excel.worksheets[0]
4.2worksheet的方法
方法 | 解释 | 例子 | 结果 |
title | 表格的标题 | sheet.title="new title" | |
max_row | 表格的最大行数 | ||
max_column | 表格的最大列数 | ||
min_row | 表格的最小行 | ||
min_column | 表格的最小列 | ||
rows | 按行获取单元格(Cell对象)-生成器 | ||
columns | 按列获取单元格(Cell对象)-生成器 | ||
dimensions | 表格的大小,即左上角和右下角的坐标 | ||
freeze_panes | 冻结窗格,主要用于冻结顶部的行或左边的列,用户滚动表格时始终可见 | ||
values | 按行获取表格的数据内容-生成器 | ||
iter_rows(min_row=1,max_row=4,min_col=2,max_col=4) | 按行获取所有单元格 | 返回的是一个Cell对象,Cell对象不等于cell的值 | |
iter_columns | 按列获取所有单元格 | ||
append | 在表格末尾添加数据 | ||
merged_cells | 合并多个单元格 | ||
unmerged_cells | 移除合并的单元格 | ||
获取cell对象 | excel['sheetname']['A1'] | 返回一个Cell对象 |
|
excel['sheetname'].cell(row=1,column=2) | 返回一个Cell对象 |
||
sheet_properties.tabColor | 给sheet的标题一个背景颜色 | sheet.sheet_properties.tabColor='e7e7e7' |
5.Cell对象
5.1 获取单个cell对象
sheet['A1'] 或
sheet.cell(row=1,column=2)
5.2 获取多个cell对象
cell_range = sheet['A1':'C2'] 返回一个元祖,元祖内容是两行三列Cell对象,而非cell的value
col_content = sheet['C'] 返回C列的内容,也是元祖形式Cell对象
col_content = sheet['A:C'] 返回A列到C列(包含C列)的Cell对象,元祖形式,一列一列取值
row_content = sheet[10] 返回第10行数据
row_content = sheet[10:12] 返回第10行到第12行数据
或
sheet.iter_rows(min_row=1,max_row=4,min_col=2,max_col=4) 按行取,行数和列数都包含在内
sheet.iter_columns(min_row=1,max_row=4,min_col=2,max_col=4) 按列取
如果想迭代所有行和列
sheet.rows() 按行取
sheet.columns() 按列取
备注:多个cell对象的获取返回的都是元祖形式,根据按行取或按列取,返回元祖里的内容不太一样
5.3 cell对象的方法
方法 | 解释 | 例子 | 结果 |
row | 单元格所在的行 | excel['sheet1'].cell(row=1,column=2).row | 返回行号1 |
column | 单元格所在的列 | excel['sheet1'].cell(row=1,column=2).column | 返回列号B |
value | 单元格的值 | excel['sheet1'].cell(row=1,column=2).value | 返回单元格里的值 |
coordinate | 单元格的坐标 | excel['sheet1'].cell(row=1,column=2).coordinate | 返回坐标B1 |
5.4 cell赋值
sheet[“A3”] = "ABC" 或 sheet["A3"].value = "ABC"
sheet.cell(row=1,column=2).value = "ABC"
6.保存更改
excel.save("test.xlsx")
-----------------------------------------------------------------------------------------------------------
numpy
1.简介
numpy提供了ndarray和matrix两种类型的数据
2.安装及引用
pip install numpy
import numpy as np
3.数组的使用
3.1创建数组
a=np.array([1,2,3,4,5,6])
print a --> [1,2,3,4,5,6]
3.2 数组变形
b=a.shap(2,3) #把a变为两行三列
print b ---> [[1,2,3],[4,5,6]]
c=b.ravel() #拉直数组
print c ---> arry([1,2,3,4,5,6])
-------------------------------------------------------------------------------------------------------------
pandas
Pandas是python的一个数据分析包,建立在numpy库之上
安装:pip install pands
导入:import pandas as pd、from pandas import Series,DataFrame
Series:一维数组,Series 就如同列表一样,一系列数据,每个数据对应一个索引值。比如这样一个列表:[9, 3, 8],如果跟索引值写到一起,就是:
index | data |
0 | 9 |
1 | 3 |
2 | 2 |
创建对象:s=Series([100,"python","soochow"])
print s的时候会把里面的值和索引都打印出来,索引是从0开始的整数
输入 s.values 值
输出 array([100,'python','soochow'], dtype=object)
输入 s.index 索引
输出 Int64Index([0,1,2], dtype=int64)
series可以自定义索引
s2=Series([100,'python','soochow'], index=['mark','title','name'])
输入 s2.index
输出 Index(['mark','title','name'],dtype=object)
可以根据索引,修改元素的值,例如s2["name"]="qq"
另外一种定义方法:
sd={"python": 8000,"c++":8100,"c#":4000} 前面的数是索引,后面的是值
s4=Series(sd)
c# | 4000 |
c++ | 8100 |
python | 8000 |
s4里面的数据内容可以根据索引的不同位置而改变,根据索引而自动对齐排列,如果索引不存在自动赋值NaN,索引的名字也是可以重新定义的,例如
s6=Series(sd, index=["java","python","c++","c#"])
java | NaN |
python | 8000 |
c++ | 8100 |
c# | 4000 |
pd.isnull(s6)/pd.notnull(s6)用来判断值是否为空,值为True/False则索引对应的值是空
java | True |
python | False |
c++ | False |
c# | False |
备注:或用对象方法s6.isnull()
如果series里面的数据都是数字的话,是可以计算的,比如s3[s3>5]取s3里的值大于5的项,s3*5得到的是s3里的值都乘以5
DataFrame:二维的表格型数据结构,类似数据库中的table,竖行称之为columns,横行为index
import pandas as pd
from pandas import Series, DataFrame
data = {"name":["yahoo","google","facebook"], "marks":[200,400,800], "price":[9, 3, 7]}
f1 = DataFrame(data)
f1的值:
marks name price
0 200 yahoo 9
1 400 google 3
2 800 facebook 7
字典中的键就是DataFrame的columns的值,columns的顺序没有规定,就如同字典中键的顺序一样,但是他的顺序是可以被规定的。
columns的数量还可以比data的columns的数量多,会被自动赋值NaN
f2 = DataFrame(data, columns=['name','price','marks'])
f2的值:
name price marks
0 yahoo 9 200
1 google 3 400
2 facebook 7 800
DataFrame还可以定义index的值,index的数量不能超过data的行数,否则会报错:
f3 = DataFrame(data, columns=['name', 'price', 'marks', 'debt'], index=['a','b','c'])
f3的值:
name price marks debt
a yahoo 9 200 NaN
b google 3 400 NaN
c facebook 7 800 NaN
另外一种定义方式:第一层键是数列名称,第二层字典键是每横行索引,第二层字典值是对应的数据
newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}}
f4 = DataFrame(newdata)
f4的值:
lang price
firstline python 8000
secondline java NaN
DataFrame(newdata, index=["firstline","secondline","thirdline"]) #额外添加了索引,默认为NaN
lang price
firstline python 8000
secondline java NaN
thirdline NaN NaN
取值,取出来的是Series,所以说DataFrame是由一个一个的series组成的:
f3['name']
a yahoo
b google
c facebook
Name: name
f3['debt'] =
Series([2.2, 3.3], index=["a","c"]) 得到
name price marks debt
a yahoo 9 200 2.2
b google 3 400 NaN
c facebook 7 800 3.3
赋值:
f3['debt'] = 89.2
f3的值:
name price marks debt
a yahoo 9 200 89.2
b google 3 400 89.2
c facebook 7 800 89.2
f3["price"]["c"]= 300
name price marks debt
a yahoo 9 200 2.2
b google 3 400 NaN
c facebook 300 800 3.3
Panel:三维的数组
读取excel(需要安装openpyxl pip install openpyxl)
xls=pd.ExcelFile("./marks.xlsx")
获取sheet表
sheet1=xls.parse("Sheet1")