python对csv和excel文件的操作详解

目录

一、csv文件

二、Excel 表格

2.1 读取excel文件

2.2 写入excel文件

2.3 单元格字体风格

2.4 公式

2.5 调整行和列

2.6 合并和拆分单元格

2.7 冻结窗口

2.8 图标表


一、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)
​
输出:

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种方法:

BarChart()方法绘画条形图。

LineChart()方法绘画折线图。

ScatterChart()方法绘画散点图。

PieChart()方法绘画饼图。

你可能感兴趣的:(python,excel,开发语言)