IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python读写excel -> 正文阅读

[Python知识库]python读写excel

1、问题

对成绩单信息进行统计,包括试卷中各个题目的得分情况。由于手动统计太过费时,因此想到使用python进行处理,处理文件类型为.xlsx
在这里插入图片描述

2、使用python库

xlrd:读取excel数据(只能读取)
如果只想读excel文件可以使用,安装时不要使用pip install xlrd,存在版本不一致问题。
在这里插入图片描述

正确安装:进入python官网下载http://pypi.python.org/pypi/xlrd模块安装,但需要注意版本,我在使用xlrd2.0.1读取文件(xlrd.open_workbook())时报错xlrd.biffh.XLRDError: Excel xlsx file; not supported其实是版本不一致,xlrd版本过高。
在这里插入图片描述

最终下载的xlrd3,也是从官网下载的安装包:https://pypi.org/project/xlrd3/,利用pip install xxxxx.whl安装使用时import xlrd3python版本为3.7
在这里插入图片描述

xlwt:写入excel文件,同样,在使用pip install xlwt时安装失败,进入官网下载安装包:https://pypi.org/project/xlwt
在这里插入图片描述

以上两个库只能单独读取或写入excel文件,对于既读又写很麻烦,因此我最终使用的是openpyxl。
**③openpyxl:**直接使用pip install安装失败,进入https://pypi.org/project/openpyxl下载安装包。
在这里插入图片描述

3、使用:只对单元格的数据进行读取和写入

xlrd3xlrd3.open_workbook(path)打开xlsx文件;sheet_by_index(0)根据索引找到第一个工作簿,也可以根据工作表的名字定位;.cell_value(j+1, i+3))根据行-列定位单元格,读取单元格数据,注意从0开始。

import xlrd3

test_score = [5., 10., 20., 20., 15., 6., 6., 6., 6., 6.]  # 每小题分数

path = 'XXXXX\\成绩单.xlsx'

excel_ = xlrd3.open_workbook(path)  # 打开文件

table_1 = excel_.sheet_by_index(0)  # 也可以直接根据工作表的名字读取

person_ = [[] for i in range(11)]  # 存单元格数据

for i in range(11):  # 题号/ 列号
    for j in range(6):  # 人数
        print(table_1.cell_value(j+1, i+3))  # 按单元格读取数据
        if table_1.cell_value(j+1, i+3) != '' and table_1.cell_value(j+1, i+3) != '旷考':
            person_[i].append(table_1.cell_value(j+1, i+3))
    # 统计
    count = 0
    for k in range(len(person_[i])):
        if person_[i][k] <= test_score[i] * 1.0 and person_[i][k] >= test_score[i] * 0.9:  # 统计
            count += 1

由于我只是做简单的统计,涉及用法不多,其他的可以参考:
https://blog.csdn.net/miaoca/article/details/120129553
https://blog.csdn.net/u013250071/article/details/81911434

openpyxl:
load_workbook(path)打开xlsx文件;excel_['Sheet1']根据工作簿名字定位;cell(j, i).value根据行-列定位单元格,读取单元格数据,注意从1开始。想要在k行m列写入新的数据时,直接对单元格进行赋值,cell(k,m).value=x更改后直接使用save保存文件就可以,为避免覆盖原文件可以重命名。

from openpyxl import workbook, load_workbook

test_score = [5., 10., 20., 20., 15., 6., 6., 6., 6., 6., 100., 100., 100., 100.]
path = 'XXXXX\\成绩单.xlsx'
excel_ = load_workbook(path)  # 载入文件

table_1 = excel_['Sheet1']  # 根据工作表名字定位

person_ = [[] for i in range(14)]
print(person_)
for i in range(14):  # 列号
    if i != 11:
        for j in range(82):  # 行号
            # print(table_1.cell(j+2, i+4).value)
            if table_1.cell(j+2, i+4).value != '' and table_1.cell(j+2, i+4).value != '旷考' and table_1.cell(j+2, i+4).value != None:
                person_[i].append(float(table_1.cell(j+2, i+4).value))
        # 统计
        # 0.9 - 1.0
        count = 0
        for k in range(len(person_[i])):
            if person_[i][k] <= test_score[i] * 1.0 and person_[i][k] >= test_score[i] * 0.9:
                count += 1
        # print(j, count)
        table_1.cell(j+3, i+4).value = count  # 写入数据
        # 0.8 - 0.9
        count = 0
        for k in range(len(person_[i])):
            if person_[i][k] < test_score[i] * 0.9 and person_[i][k] >= test_score[i] * 0.8:
                count += 1
        # print(j, count)
        table_1.cell(j+4, i+4).value = count

        # 0.7 - 0.8
        count = 0
        for k in range(len(person_[i])):
            if person_[i][k] < test_score[i] * 0.8 and person_[i][k] >= test_score[i] * 0.7:
                count += 1
        # print(j, count)
        table_1.cell(j + 5, i + 4).value = count

        # 0.6 - 0.7
        count = 0
        for k in range(len(person_[i])):
            if person_[i][k] < test_score[i] * 0.7 and person_[i][k] >= test_score[i] * 0.6:
                count += 1
        # print(j, count)
        table_1.cell(j + 6, i + 4).value = count

        # 0. - 0.6
        count = 0
        for k in range(len(person_[i])):
            if person_[i][k] < test_score[i] * 0.6:
                count += 1
        # print(j, count)
        table_1.cell(j + 7, i + 4).value = count

        # max
        max_ = max(person_[i])
        table_1.cell(j + 8, i + 4).value = max_

        # min
        min_ = min(person_[i])
        table_1.cell(j + 9, i + 4).value = min_

        # average
        average = sum(person_[i])/len(person_[i])
        table_1.cell(j + 10, i + 4).value = average

excel_.save('XXXXX\\成绩单(副本).xlsx')  # 更新工作表,为避免覆盖原工作表,可以另存

其他关于单元格处理、绘图、样式设置可参见:
https://blog.csdn.net/weixin_41546513/article/details/109555832

4、其他:

①在处理通过公式计算得到的单元格时,读取时读到的并不是数据,而是公式,如(2,3)=(2,1)*0.9+(2,2)*0.1,在读(2,3)时得到的是(2,1)*0.9+(2,2)*0.1,此时可以先复制数据→清空单元格内容→只粘贴数值。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:24:34  更:2022-09-21 00:27:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:44:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码