python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python操作excel

Python操作excel文件与csv文件方法详解

作者:WDLOVELONGLONG

这篇文章主要介绍了Python操作excel文件与csv文件方法,csv文件可以直接通过excel打开,以行列保存显示文件,相比与excel来说它只能保存数据,不能保存公式和函数,然而python处理两种文件的方式大同小异,感兴趣的朋友可以参考下

一、csv文件

csv也叫逗号分隔值文件 —— 每一行内容是通过逗号来区分出不同。

csv文件可以直接通过excel打开。以行列保存显示文件,相对excel 他只能保存数据,不能保存公式和函数

csv.reader(文件对象) —— 获取文件内容,并且以列表为单位返回每一行内容

以下示例是CSV文件的写操作:

with open('data.csv','w',) as csvfile:
    writer = csv.writer(csvfile,delimiter = ' ')
    writer.writerows([['id','name','age'],['10001','Mike',20],['10002','Bob',22],['10003','Jordan',21]])
    writer.writerow(['10004','Long',25])
with open('data.csv','w',) as csvfile:
    fieldnames = ['id','name','age']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter='\t')
    writer.writeheader()
    writer.writerow({'id':'10001','name':'Mike','age':21})
    writer.writerow({'id':'10002','name':'Bob','age':22})
    writer.writerow({'id':'10003','name':'Jordan','age':25})
with open('data.csv','a',encoding='utf-8') as csvfile:
    fieldnames = ['id','name','age']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter='\t')
    writer.writeheader()
    writer.writerow({'id':'10010','name':'小子','age':30})

wirterow方法可以写入单行,delimiter参数设置每列之间的间隙。witerrows方法可以写入多行。同时若要以字典的形式写入,则可以使用DictWriter类生成一个对象,然后传入字典。

csv的读操作即可使用csv模块,也可以使用pandas模块,示例如下:

with open('data.csv','r',encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)
#ctrl + b查看内置底层文件代码
import pandas as pd
df = pd.read_csv('data.csv')
for index, row in df.iterrows():
    print(row.tolist()) #以列表的形式输出

二、Excel 表格

2.1 读取excel文件

使用openpyxl的openpyxl.load_workbook方法,可以打开一个excel文件,该方法接受一个文件名,返回一个workbook数据类型的值,创建的对象代表这个excle文件:

import openpyxl
workbook = openpyxl.load_workbook('csv.xlsx') #打开一个xlsx文件
print(type(workbook))
得到一个excel文件对象之后,访问sheetnames属性可以取得工作簿所有表名的列表,示例:
print(workbook.sheetnames) #得到所有工作表名,返回一个列表
sheet = workbook.sheetnames
print(sheet)

也可以得到活动表,示例如下:

print(workbook.sheetnames) #得到所有工作表名,返回一个列表
sheet = workbook.sheetnames
# print(sheet)
sheet1 = workbook.active #获取活动表
print(sheet1)
print(sheet1.title)  #获取活动表,即选中的表的名字

得到sheet对象后,可以按照名字访问Cell对象,Cell对象的value包含这个单元格的值,row属性是这个单元格的行数,column是这个单元格的列数,行和列都是从1开始。coordinate属性是这个单元格名字,如A1

示例如下:

#访问Cell对象
print(sheet1['D5'])
D5 = sheet1['D5']
print(D5.value)
print(D5.row)
print(D5.column)
print(D5.coordinate)

输出:
<Cell 'Sheet1'.D5>
0.85242
5
4
D5

如果要输出多个数据,可以使用sheet.cell()方法,传入row参数和column参数,同样可以得到一个Cell对象,示例如下:

for i in range(1,10):
    for j in range(1,5):
        print(i,j,":",sheet1.cell(row=i, column=j).value)

如果要输出所有的数据,可以通过max_row和max_column属性来确定表的大小,示例如下:

print(sheet1.max_row,sheet1.max_column)
# for i in range(1,sheet1.max_row + 1):
#     for j in range(1,sheet1.max_column + 1):
#         print(i,j,":",sheet1.cell(row=i, column=j).value)

如果要想列数转化为字母,则可以调用openpyxl.utils.get_column_letter()函数,如果要想字母转化为数字openpyxl.utils.column_index_from_string()函数

print(openpyxl.utils.get_column_letter(sheet1.max_column))
print(openpyxl.utils.column_index_from_string('AA'))

worksheet对象支持切片,可以取得电子表格中的一行、一列或者一个矩形区域中的所有Cell对象。然后遍历这个单元中的所有单元格:

print(list(sheet1['A1':'D5']))
for rowofCellObjects in sheet1['A1':'D5']:
    for cellObject in rowofCellObjects:  #得到每一行的单元格对象
        print(cellObject.coordinate, cellObject.value) #每个单元格对象

如果想要访问特定行或列的单元格的值,可以使用Worksheet对象的rows和columns属性,这些属性必须被list()函数转化为列表,才能使用方括号和索引,示例如下:

#访问第二列的值
print(list(sheet1.columns)[2])
for cellObj in list(sheet1.columns)[2]:
    print(cellObj.coordinate, cellObj.value)
#访问第二行的值
print(list(sheet1.rows)[2])
for cellObj in list(sheet1.rows)[2]:
    print(cellObj.coordinate, cellObj.value)

2.2 写入excel文件

创建和保存excel文档,调用openpyxl.Workbook()函数以创建一个新的空Workbook对象,示例如下:

import openpyxl
import os
#创建excel文件对象
workbook = openpyxl.Workbook()  #新建工作薄
print(workbook.sheetnames)
os.path.exists('./data2.xlsx') or workbook.save('data2.xlsx')  #不存在则创建

创建和删除工作表,使用create_sheet()方法可以创建工作表,index参数指定工作表的位置,title参数指定工作表的名称

#创建新的工作表
workbook.create_sheet(index=1, title='sheet2')
print(workbook.sheetnames)
del workbook['sheet2']
print(workbook.sheetnames)
workbook.save('data2.xlsx') 

写入数据,像字典一样,将单元格坐标的字符串作为键值,用于Worksheet对象,指定要写入的单元格:

sheet1 = workbook.active
sheet1['A1'] = 'hello world'
workbook.save('data2.xlsx')

也可对单元格对象的value赋值:

sheet1 = workbook.active
sheet1['A1'] = 'hello world'
sheet1.cell(row=1,column=2).value = 'hello world'
sheet1.cell(row=1,column=5).value = 55
workbook.save('data2.xlsx')

注意,使用save方法时不能把data2.xlsx文件打开。

2.3 单元格字体风格

为了定义单元格的字体风格,需要从openpyxl.styles模块导入Font()函数

设置font的流程如下所示:

import openpyxl
from openpyxl.styles import Font
wrokbook = openpyxl.Workbook()
sheet = wrokbook.active
italic24Font = Font(size=24, italic=False) #创造一种字体风格  字号24,斜体
sheet['A1'].font = italic24Font #将这种风格用于单元格A1
sheet['A1'] = 'Hello world!'
wrokbook.save('data2.xlsx')

Font style属性的关键字参数

name : 字符串 字体名称,比如“Calibri"或者"Times New Romam"

size : 整形 字号大小

bold : 布尔型 是否粗体

italic : 布尔型 是否斜体

示例:

import openpyxl
from openpyxl.styles import Font
wrokbook = openpyxl.Workbook()
sheet = wrokbook.active
italic24Font = Font(name= 'Times New Roman',bold=True,size=24, italic=True) #创造一种字体风格  字号24,斜体
sheet['A1'].font = italic24Font #将这种风格用于单元格A1
sheet['A1'] = 'Hello world!'
wrokbook.save('data2.xlsx')

2.4 公式

excel表格中的公式是以一个等号开始,可以配置单元格来让它包含通过其他单元格计算得到的值。在python中,其操作方法和往excel中写入数据一样,以某个单元格为键值,输入相应的公式

wrokbook = openpyxl.load_workbook('data.xlsx')
sheet = wookbook.active
sheet['D25'] = '=SUM(I2:I23)'
print(sheet['D25'].value)
wrokbook.save('data.xlsx') #保存更改

在excel表中可以看见已经写入的数据。

2.5 调整行和列

Worksheet对象有row_dimensions和column_dimensions属性,分别用于控制行高和列宽:

wrokbook = openpyxl.Workbook()
sheet = wrokbook.active
sheet['A1'] = 'tall row'
sheet['B2'] = 'wide column'
sheet.row_dimensions[1].height = 70  #设置列高
sheet.column_dimensions['B'].width = 20  #设置列宽
wrokbook.save('test.xlsx')

2.6 合并和拆分单元格

利用merge_cells()工作方法,可以将一个矩形区域中的单元格合并为一个单元格,示例如下:

wrokbook = openpyxl.Workbook()
sheet = wrokbook.active
sheet.merge_cells('A1:D3') #合并表格
sheet['A1'] = 'Twelve cells merged together'
sheet.merge_cells('C5:D5') #
sheet['C5'] = 'Two merged cells'
wrokbook.save('data2.xlsx')

拆分单元格则使用unmerge_cells方法,示例如下:

sheet.unmerge_cells('A1:D3')
sheet.unmerge_cells('C5:D5')
wrokbook.save('data2.xlsx')

2.7 冻结窗口

对于太大而不能一屏显示的电子表格,”冻结“顶部的几行或最左边的几列是非常有帮助的,冻结之后,就算用户滚动电子表格,冻结的列或行表头也是始终可见的,这称为”冻结窗格“。

在openpyxl中,每个Worksheet对象都有一个freeze_panes属性,该属性可以设置为一个Cell对象或一个单元格坐标的字符串,需要注意的是,单元格上边的所有行和左边的所有列都会冻结,但单元格所在行和列不会冻结。

要冻结所有的单元格,就将freeze_panes设置None或'A1'。

要冻结窗格的例子:

freeze_panes的设置 冻结的行和列

sheet.freeze_panes = 'A2' 行1

sheet.freeze_panes = 'B1' 列A

sheet.freeze_panes = 'C1' 列A和列B

sheet.freeze_panes = 'C2' 行1、列A和列B

sheet.freeze_panes = 'A1' 没有冻结框格

sheet.freeze_panes = 'None' 没有冻结框格

wrokbook = openpyxl.load_workbook('data2.xlsx')
sheet = wrokbook.active
sheet.freeze_panes = 'A2' #冻结第一行
wrokbook.save('data2.xlsx')

2.8 图标表

openpyxl支持利用工作表中单元格的数据来创建条形图、折线图、散点图和饼图。创建图表有以下步骤:

1、从一个矩形区域选择单元格来创建一个Reference对象。

2、通过传入Reference对象来创建一个Series对象

3、创建一个Chart对象。

4、将Series对象添加到Chart对象。

5、可选地设置Chart对象的drawing.top,drawing.left、drawing.width和drawing.height属性。

6、将Chart对象添加到Worksheet对象。

Reference对象需要一些解释。Reference对象是通过调用openpyxl.charts。Reference()函数并传入以下3个参数来创建的。

1、包含图表数据的Worksheet对象。

2、两个整数的元组,代表矩形选择区域的左上角单元格,该区域包含图表数据:元组中底一个整数是行,第二个整数是列。这里需要注意的是第一行是1而不是0.

3、两个整数的元组,代表矩形选择区域的右下角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。

workbook = openpyxl.load_workbook('data2.xlsx')
sheet = workbook.active
for i in range(1,11):
    sheet['A' + str(i)] = i #给单元格赋值
#选择X、Y轴数据,并创建成一个数据系列,这是绘画散点图的步骤
xdata=openpyxl.chart.Reference(sheet, min_col = 1, min_row = 1, max_col = 1, max_row = 10)
ydata=openpyxl.chart.Reference(sheet, min_col = 1, min_row = 1, max_col = 1, max_row = 10)
series1=openpyxl.chart.Series(ydata,xdata,title_from_data=False)
series1.marker.symbol = "circle"
# 设置系列1数据点的颜色,以下两行代码将其改为红色
series1.marker.graphicalProperties.solidFill = "FF0000"  # 点的内部填充颜色
series1.marker.graphicalProperties.line.solidFill = "FF0000"  # 点的外边框颜色
# 关键的一步:关闭系列1数据点之间的连接线
series1.graphicalProperties.line.noFill = True
refobj = openpyxl.chart.Reference(sheet, min_col = 1, min_row = 1, max_col = 1, max_row = 10) # 创建Reference对象
seriesobj = openpyxl.chart.Series(refobj, title = 'First series') #传入reference对象创建一个series对象
chartobj = openpyxl.chart.BarChart()  #创建chart对象
chartobj.title = '条形图'  #图标标题
#设置x轴和y轴
chartobj.y_axis.title='Y轴'
chartobj.x_axis.title='X轴'
chartobj.append(seriesobj)  #将series添加到chart对象
#画一个条形图
sheet.add_chart(chartobj, 'C5')  #左顶角位于C5
workbook.save('data2.xlsx')
#画一个折线图
chartobj = openpyxl.chart.LineChart()  #创建chart对象
chartobj.title = '折线图'  #图标标题
#设置x轴和y轴
chartobj.y_axis.title='Y轴'
chartobj.x_axis.title='X轴'
chartobj.append(seriesobj)  #将series添加到chart对象
sheet.add_chart(chartobj, 'C20')  #左顶角位于C5
workbook.save('data2.xlsx')
# #画一个散点图
chartobj = openpyxl.chart.ScatterChart()  #创建chart对象
chartobj.title = '散点图'  #图标标题
#设置x轴和y轴
chartobj.y_axis.title='Y轴'
chartobj.x_axis.title='X轴'
chartobj.append(series1)  #将series添加到chart对象
sheet.add_chart(chartobj, 'C35')  #左顶角位于C5
workbook.save('data2.xlsx')
#画一个饼图
chartobj = openpyxl.chart.PieChart()  #创建chart对象
chartobj.title = '饼图'  #图标标题
chartobj.append(seriesobj)  #将series添加到chart对象
sheet.add_chart(chartobj, 'C55')  #左顶角位于C5
workbook.save('data2.xlsx')

以上代码使用了4种方法:

以上就是Python操作excel文件与csv文件方法详解的详细内容,更多关于Python操作excel的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文