欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

程序员文章站 2022-07-08 15:49:17
CSV文件...

CSV文件处理

CSV文件读取的两种方式

1、reader(fp)
这种方式读取到的每一条数据是一个列表,元素需要通过列表名加下标的方式获取

import csv

def open_csv_1(file_obj):
	'''
	这种方式读取到的每一条数据是一个列表,元素需要通过列表名加下标的方式获取
	'''
	with open(file_obj, 'r', encoding = 'utf-8' ) as fr:
		reader = csv.reader(fr)
		for i in reader:
			print(i[index])
file_obj = './test.csv'
open_csv_1(file_obj)

2、DictReader(fp)
这种方式读到的每一条数据是一个字典,通过关键字形式获取需要的值

import csv

def open_csv_1(file_obj):
	'''
	这种方式读到的每一条数据是一个字典,通过关键字形式获取需要的值
	'''
	with open(file_obj, 'r', encoding = 'utf-8' ) as fr:
		reader = csv.DictReader(fr)
		for i in reader:
			print(i['name'])
file_obj = './test.csv'
open_csv_1(file_obj)

CSV文件写入的两种方式

1、writer(fp)
创建了一个writer的对象,用这个对象可以调用writerow、writerows方法,将python对象写入csv文件

import csv

head = ('name', 'age', 'score')
student = [
	('张三', 12, 100),
	('李四', 23, 99),
	('王五', 14, 1001)
]
# newline 是为了保证csv中的数据之间不会出现空行,默认是\n
with open('student.csv', 'w', encoding = 'utf-8', newline = '') as f:
	content = csv.writer(f)
	# writerow只能写入一行数据
	content.writerow(head)
	# writerows可以将全部内容写入
	content.writerows(student)

python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

2、DictWriter(fp, head)

# 如果要用DicWriter方法的话,数据就要修改成字典的样式了
student = [
	{'name':'张三','age': 12,'score' :100},
	{'name':'李四','age': 23,'score' :99},
	{'name':'王五','age': 14,'score' :1001}
]
with open('student1.csv', 'w', encoding = 'utf-8', newline = '') as f:
	# DictWriter方法中除了文件指针之外,还需要加入存储头部数据的变量名
	# 但是这没有办法直接将head头部数据写入
	# 还需要调用writeheader()方法才可
	content = csv.DictWriter(f, head)
	content.writeheader()
	# writerow只能写入一行数据
	# content.writerow(head)
	# writerows可以将全部内容写入
	content.writerows(student)

python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

Excel文件处理

openpyxl与xlrd/xlwt的区别和效率

区别: 效率:
python中xlrd/xlwt与openpyxl处理Excel的主要区别在于写入操作,其中xlwt针对Ecxec2007之前的版本,即.xls文件,其要求单个sheet不超过65535行,而openpyxl则主要针对Excel2007之后的版本(.xlsx),它对文件大小没有限制。 整体而言,两种包对小文件的读写速度差别不大,而面对较大文件,xlrd/xlwt速度明显优于openpyxl,但因为xlwt无法生成xlsx是个硬伤,所以想要尽量提高效率又不影响结果时,可以考虑用xlrd读取,用openpyxl写入。

读取Excel文件

打开Excel文件

xlrd.open_workbook('test.xls')

获取sheet

sheet_names() 获取所有sheet的名字
sheet_by_index() 根据索引获取sheet对象
sheet_by_name() 根据名字获取sheet对象
sheets() 获取所有sheet对象
sheet.nrows 获取当前sheet的行数
sheet.ncols 获取当前sheet的列数

基本的代码操作

import xlrd
import xlwt
workbook = xlrd.open_workbook('chart_style.xlsx')
# sheet_names()获取文件当中所有sheet名字
print(workbook.sheet_names())
# sheet_by_index() 通过索引获取对象
sheet = workbook.sheet_by_index(1)
print(sheet.name)
# sheet_by_name()  通过名字获取对象
sheet = workbook.sheet_by_name('bubbleChart')
print(sheet.name)
# sheets()  获取所有sheet对象 返回值是list
sheet = workbook.sheets()
print(sheet)
# sheet.nrows() 获取指定sheet行数
sheet = workbook.sheet_by_name('pieChart')
print(sheet.nrows)
# sheet.ncols() 与上面同理

excel文件中的相应数据
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)
代码运行之后获取的对应结果
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

cell的相关操作

sheet.cell(row,col) 获取指定行和列的cell对象
sheet.row_slice(row,start_col,end_col) 获取指定行的某几列的cell对象
sheet.col_slice(col,start_row,end_row) 获取指定列的某几行的cell对象
sheet.cell_value(row, col) 获取指定行和列的值
sheet.row_values(row,start_col,end_col) 获取指定行的某几列的值
sheet.col_values(col, start_row, end_row) 获取指定列的某几行的值

具体实现的代码

# cell相关操作
# 先获取某一个sheet
sheet1 = workbook.sheet_by_index(0)
# 获取指定行列的cell对象
cell = sheet1.cell(0,1)
# cell.value 获取单元格的值
print(cell.value)
# 获取指定行的某几列cell对象
cell_row = sheet1.row_slice(0,0,2)
print(cell_row, type(cell_row))
# 获取指定列的某几行cell对象
cell_col = sheet1.col_slice(1, 0, 6)
print(cell_col)
for cell in cell_col:
	print(cell.value)
# 直接获取指定行列的cell值
cell_value = sheet1.cell_value(3,1)
print(cell_value)
# 获取指定行的某几列的值
cell_row_value = sheet1.row_values(1,0,2)
print(cell_row_value)
# 获取指定列的某几行的值
cell_col_value = sheet1.col_values(0,1,6)
print(cell_col_value)

文件的具体数据
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

实现的结果
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

cell的数据类型

xlrd.XL_CELL_TEXT(Text) 文本类型
xlrd.XL_CELL_NUMBER(Number) 数值类型
xlrd.XL_CELL_DATE(Date) 日期时间类型
xlrd.XL_CELL_BOOLEAN(Bool) 布尔类型
xlrd.XL_CELL_EMPTY 空白数据类型

处理的文件数据
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)
具体实现的代码

#cell的数据类型
# 先获取sheet
sheet1 = workbook.sheet_by_index(1)
# 获取cell
cell = sheet1.cell(0, 0)
print(cell.ctype)
print('xlrd.XL_CELL_TEXT:',xlrd.XL_CELL_TEXT)
cell = sheet1.cell(1, 1)
print(cell.ctype)
print('xlrd.XL_CELL_NUMBER:', xlrd.XL_CELL_NUMBER)
cell = sheet1.cell(7, 0)
print(cell.ctype)
print('xlrd.XL_CELL_DATE:', xlrd.XL_CELL_DATE)
cell = sheet1.cell(7, 1)
print(cell.ctype)
print('xlrd.XL_CELL_BOOLEAN:', xlrd.XL_CELL_BOOLEAN)
cell = sheet1.cell(7, 2)
print(cell.ctype)
print('xlrd.XL_CELL_EMPTY:', xlrd.XL_CELL_EMPTY)

实现效果

python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

写入Excel文件步骤

1、 导入xlwt模块
2、 创建一个Workbook对象
3、 创建一个Sheet对象
4、 使用sheet.write方法把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需要调用put_cell来添加
5、 保存成Excel文件

具体实现代码:

# 写入excel文件
# 创建写入文件的对象
workbook = xlwt.Workbook()
# add_sheet 创建一个sheet
sheet = workbook.add_sheet('case_sheet')
headers = ['姓名', '语文', '英语', '数学']
for i, head in enumerate(headers):
	'''
	调用write方法写入数据
	write方法中第一个参数:行
	第二个参数:列
	第三个参数:要写入的内容
	'''
	sheet.write(0, i, head)
# 写入姓名
names = ['张三', '李四', '王五', '赵六']
for i , name in enumerate(names):
	sheet.write(i+1, 0, name)
# 批量写入数据
for row in range(1, 5):
	for col in range(1, 4):
		sheet.write(row, col, random.randint(60, 100))
# 保存文件
workbook.save('case_write.xlsx')

python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

编辑Excel文件

思路、步骤

1、 先读取原来的Excel文件
2、 然后在读取的sheet上进行单元格的修改
用put_cell(row, col,ctype,vaule,None)即可
3、 重新创建一个新的Excel文件,把之前读到的数据写入的新的文件中

详细代码:

import xlrd
import xlwt
import math
# 打开一个excel文件
rworkbook = xlrd.open_workbook('chart_style.xlsx')
# 获取一个sheet
rsheet = rworkbook.sheet_by_name('bubbleChart')
'''
在原有文件的基础上要加入新的内容
需要用到put_cell方法
里面有五个参数
rowx,colx,ctype,value,xf_index
最后一个参数是去控制样式,写None即可
'''
rsheet.put_cell(0, 3, xlrd.XL_CELL_TEXT,'money', None)
# 读取数据
for row in range(1, rsheet.nrows):
	row_value = rsheet.row_values(row,1,3)
	print(row_value)
	total_money = row_value[0]*row_value[1]
	print(total_money)
	rsheet.put_cell(row,3,xlrd.XL_CELL_NUMBER, total_money,None)
nrows = rsheet.nrows
# 求各数据的平均值 sales、market share 、money
for col in range(1, 4):
	total = rsheet.col_values(col, 1, nrows)
	print('总数', total)
	avg = sum(total) / len(total)
	rsheet.put_cell(nrows, col, xlrd.XL_CELL_NUMBER, avg, None)
	print(avg)

#  写入数据
# 创建Workbook对象
wworkbook = xlwt.Workbook()
wsheet = wworkbook.add_sheet('bubbleChart_add')
# 获取原始文件的行列数
nrows = rsheet.nrows
ncols = rsheet.ncols
for row in range(0, nrows):
	for col in range(0, ncols):
		wsheet.write(row, col, rsheet.cell_value(row, col))
wworkbook.save('更新之后的.xlsx')

运行结果:
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)

本文地址:https://blog.csdn.net/Z_love_u/article/details/110238399