python3读取excel表数据(可指定sheet表读取及设置读取后返回的数据类型)

1、前述介绍

我在测试一个智能对话项目时需要评估对话的准确率,就设计了一些问题放到excel表中,读取问题并触发问答后把响应信息按需要的数据写入到另外一个excel中。基于这个,我分别写了读excel函数和写excel函数。
使用方法、注意事项、参数介绍等均在源码中有注释,不在这里赘述,下面直接看源码。

写excel表文章地址:https://www.jianshu.com/p/8843cefc1cd2

2、源码

# 读excel文件
def readExcel(readExcelNameOrPath='', readSheets=None, contentType='json'):
    import xlrd, os, json
    # 参数说明
    # readExcelNameOrPath  读取excel的文件名称(aa.xls)或文件的绝对路径(r"E:\test\aa.xls"),如果为文件名称,必须放到当前目录下
    # readSheets   要读取的sheet表名称,如果不设置默认读取第一个表,如果设置为all代表读取全部的sheet的内容,注意:只有['all']这种情况下才读取全部sheet
    # contentType   设置返回值的类型
    # 注意:如果路径中出现转义字符,如\t,\n等,路径前面加r,如 r"E:\test\aa.xls"
    # 返回值格式:{sheetName:[{"row": 0, "col": 0, "content": content}, ..., {"row": m, "col": n, "content": content}]}

    readExcelNameOrPath = str(readExcelNameOrPath)
    contentType = str(contentType).lower()
    readSheetsContent = {}  # key为sheet表名称,value为对应sheet的内容list
    readSheetsInfoList = []

    try:
        # 处理传参错误时的情况
        if not os.path.isfile(os.path.abspath(readExcelNameOrPath)):
            readSheetsContent['文件错误'] = '文件名称或路径设置错误[%s]' % (readExcelNameOrPath, )
            readSheetsContent['规则'] = '只设置文件名称,需要将文件放到当前目录下;如果设置路径,必须为文件的绝对路径,如%s' % (r"E:\test\aa.xls", )
            if contentType != 'dict':
                readSheetsContent = json.dumps(readSheetsContent, ensure_ascii=False)
            return readSheetsContent
        if not (os.path.abspath(readExcelNameOrPath).endswith('.xls') or os.path.abspath(readExcelNameOrPath).endswith('.xlsx')):
            readSheetsContent['文件错误'] = ' 文件格式错误,必须为excel文件,后缀名只能为.xls和.xlsx'
            if contentType != 'dict':
                readSheetsContent = json.dumps(readSheetsContent, ensure_ascii=False)
            return readSheetsContent
        # 打开文件
        excelInfo = xlrd.open_workbook(readExcelNameOrPath)

        # 需要读取的sheet表参数传参异常时默认读取第一个
        if not isinstance(readSheets, list) or not readSheets:
            temSheet = excelInfo.sheet_by_index(0)
            readSheetsInfoList.append(temSheet)
        else:
            # 如果设置为all,处理全部sheet表格
            if len(readSheets) == 1 and str(readSheets[0]).lower() == 'all':
                for sheetIndex in range(0, excelInfo.nsheets):
                    temSheet = excelInfo.sheet_by_index(sheetIndex)
                    readSheetsInfoList.append(temSheet)

            # 按设置的sheet表名称进行处理
            else:
                for sheetName in readSheets:
                    sheetName = str(sheetName)
                    try:
                        temSheet = excelInfo.sheet_by_name(sheetName)
                        readSheetsInfoList.append(temSheet)
                    except:
                        # sheet表名称找不到时返回提示信息,注意:区分大小写
                        readSheetsContent[sheetName] = ['该sheet表不存在']

        # 开始处理sheet表数据
        for sheetInfo in readSheetsInfoList:
            dataRows = sheetInfo.nrows
            dataCols= sheetInfo.ncols
            if dataRows > 0:
                temDict = []
                for row in range(0, dataRows):
                    for col in range(0, dataCols):
                        temD = {}
                        temD['row'] = row + 1
                        temD['col'] = col + 1
                        temD['content'] = sheetInfo.cell_value(row, col)
                        temDict.append(temD)
                readSheetsContent[sheetInfo.name] = temDict
            else:
                readSheetsContent[sheetInfo.name] = []

        # 处理返回结果的数据类型,字典或json
        if contentType != 'dict':
            readSheetsContent = json.dumps(readSheetsContent, ensure_ascii=False)
        return readSheetsContent
    except Exception as e:
        return e

3、调用及结果(三种情况,只设置了json格式,字典格式将json换成dict即可)

数据源截图:


Sheet2.png
测试1.png
测试2.png

3.1 正常读取-全部sheet

if __name__ == '__main__':
    testRead = readExcel(readExcelNameOrPath=r'E:\test\mytest\aa.xls', readSheets=['all'], contentType='json')
    print(testRead)

结果1-正常读取-全部
{"测试1": [{"row": 1, "col": 1, "content": ""}, {"row": 1, "col": 2, "content": ""}, {"row": 2, "col": 1, "content": "我在第3行第2列"}, {"row": 2, "col": 2, "content": ""}, {"row": 3, "col": 1, "content": ""}, {"row": 3, "col": 2, "content": "我在第5行第3列"}], "Sheet2": [{"row": 1, "col": 1, "content": "我在第1行第1列"}, {"row": 1, "col": 2, "content": "我在第1行第2列"}, {"row": 2, "col": 1, "content": "我在第2行第1列"}, {"row": 2, "col": 2, "content": "我在第2行第2列"}, {"row": 3, "col": 1, "content": "我在第3行第1列"}, {"row": 3, "col": 2, "content": "我在第3行第2列"}, {"row": 4, "col": 1, "content": "我在第4行第1列"}, {"row": 4, "col": 2, "content": "我在第4行第2列"}, {"row": 5, "col": 1, "content": ""}, {"row": 5, "col": 2, "content": ""}, {"row": 6, "col": 1, "content": ""}, {"row": 6, "col": 2, "content": "我在第6行第2列"}, {"row": 7, "col": 1, "content": ""}, {"row": 7, "col": 2, "content": "我在第7行第2列"}], "测试2": ["空表"]}

转为格式化展示如下:
{
    "测试1":[
        {
            "row":1,
            "col":1,
            "content":""
        },
        {
            "row":1,
            "col":2,
            "content":""
        },
        {
            "row":2,
            "col":1,
            "content":"我在第3行第2列"
        },
        {
            "row":2,
            "col":2,
            "content":""
        },
        {
            "row":3,
            "col":1,
            "content":""
        },
        {
            "row":3,
            "col":2,
            "content":"我在第5行第3列"
        }
    ],
    "Sheet2":[
        {
            "row":1,
            "col":1,
            "content":"我在第1行第1列"
        },
        {
            "row":1,
            "col":2,
            "content":"我在第1行第2列"
        },
        {
            "row":2,
            "col":1,
            "content":"我在第2行第1列"
        },
        {
            "row":2,
            "col":2,
            "content":"我在第2行第2列"
        },
        {
            "row":3,
            "col":1,
            "content":"我在第3行第1列"
        },
        {
            "row":3,
            "col":2,
            "content":"我在第3行第2列"
        },
        {
            "row":4,
            "col":1,
            "content":"我在第4行第1列"
        },
        {
            "row":4,
            "col":2,
            "content":"我在第4行第2列"
        },
        {
            "row":5,
            "col":1,
            "content":""
        },
        {
            "row":5,
            "col":2,
            "content":""
        },
        {
            "row":6,
            "col":1,
            "content":""
        },
        {
            "row":6,
            "col":2,
            "content":"我在第6行第2列"
        },
        {
            "row":7,
            "col":1,
            "content":""
        },
        {
            "row":7,
            "col":2,
            "content":"我在第7行第2列"
        }
    ],
    "测试2":[
        "空表"
    ]
}

3.2 正常读取-指定sheet

if __name__ == '__main__':
    testRead = readExcel(readExcelNameOrPath=r'E:\test\mytest\aa.xls', readSheets=['Sheet2','测试2'], contentType='json')
    print(testRead)

结果2-正常读取-指定sheet
{"Sheet2": [{"row": 1, "col": 1, "content": "我在第1行第1列"}, {"row": 1, "col": 2, "content": "我在第1行第2列"}, {"row": 2, "col": 1, "content": "我在第2行第1列"}, {"row": 2, "col": 2, "content": "我在第2行第2列"}, {"row": 3, "col": 1, "content": "我在第3行第1列"}, {"row": 3, "col": 2, "content": "我在第3行第2列"}, {"row": 4, "col": 1, "content": "我在第4行第1列"}, {"row": 4, "col": 2, "content": "我在第4行第2列"}, {"row": 5, "col": 1, "content": ""}, {"row": 5, "col": 2, "content": ""}, {"row": 6, "col": 1, "content": ""}, {"row": 6, "col": 2, "content": "我在第6行第2列"}, {"row": 7, "col": 1, "content": ""}, {"row": 7, "col": 2, "content": "我在第7行第2列"}], "测试2": ["空表"]}

转为json格式化展示如下:
{
    "Sheet2":[
        {
            "row":1,
            "col":1,
            "content":"我在第1行第1列"
        },
        {
            "row":1,
            "col":2,
            "content":"我在第1行第2列"
        },
        {
            "row":2,
            "col":1,
            "content":"我在第2行第1列"
        },
        {
            "row":2,
            "col":2,
            "content":"我在第2行第2列"
        },
        {
            "row":3,
            "col":1,
            "content":"我在第3行第1列"
        },
        {
            "row":3,
            "col":2,
            "content":"我在第3行第2列"
        },
        {
            "row":4,
            "col":1,
            "content":"我在第4行第1列"
        },
        {
            "row":4,
            "col":2,
            "content":"我在第4行第2列"
        },
        {
            "row":5,
            "col":1,
            "content":""
        },
        {
            "row":5,
            "col":2,
            "content":""
        },
        {
            "row":6,
            "col":1,
            "content":""
        },
        {
            "row":6,
            "col":2,
            "content":"我在第6行第2列"
        },
        {
            "row":7,
            "col":1,
            "content":""
        },
        {
            "row":7,
            "col":2,
            "content":"我在第7行第2列"
        }
    ],
    "测试2":[
        "空表"
    ]
}

3.3 文件设置错误

if __name__ == '__main__':
    testRead = readExcel(readExcelNameOrPath=r'hello', readSheets=['all'], contentType='json')
    print(testRead)

结果3-文件设置错误
{"文件错误": "文件名称或路径设置错误[hello]", "规则": "只设置文件名称,需要将文件放到当前目录下;如果设置路径,必须为文件的绝对路径,如E:\\test\\aa.xls"}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351