python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)
程序员文章站
2022-04-02 10:53:52
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)
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)
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文件中的相应数据
代码运行之后获取的对应结果
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)
文件的具体数据
实现的结果
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 | 空白数据类型 |
处理的文件数据
具体实现的代码
#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)
实现效果
写入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')
编辑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')
运行结果:
本文地址:https://blog.csdn.net/Z_love_u/article/details/110238399