Bootstrap

Python批量查询xls文件中是否包括某个关键词

我们曾探索用openpyxl来查询xlsx文件中的所有工作表中是否存在某个关键词,如果有的话,就打印出这个文件名的名字。

一、问题的缘起

之前用openpyxl只能打开xlsx文件,对于xls文件却束手无策,于时我就想如何解决Excel文件格式限制的问题,最终我选定了xlrd这个读取Excel文件比较快速的模块,并根据Claude提供的代码,给出了初步的解决文案。

二、初步解决

借助于Claude,我很快修改出了代码,可以批量读取当前目录下的xls文件,遍历所有的工作表,同时遍历每一个单元格。我们用os这个模块来遍历所有xls文件,用xlrd来读取Excel,通过先读取行,再读取列的方式查找所有单元格中是否包含关键词。

import os 
import xlrd

keyword = '李XX'
files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
    workbook = xlrd.open_workbook(file) 
    sheets = workbook.sheets()
    for sheet in sheets:
        for row_idx in range(sheet.nrows):
            row = sheet.row(row_idx)
            for col_idx in range(sheet.ncols):
                cell = row[col_idx]
                if str(cell.value).find(keyword) != -1:
                    print('找到关键词!文件名为:', file)

三、二次优化

针对以上代码,我又进一步思考,考虑用sheet.cell_value(row, col)来查找单元格的内容,这样可以进一步优化循环,减少代码量,加快代码执行的速度。而且,这次代码中省去了str()和find()两个函数,执行效率大幅提升。

import os 
import xlrd

keyword = '李XX'

files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
    workbook = xlrd.open_workbook(file) 
    sheets = workbook.sheets()
    for sheet in sheets:
        for row in range(sheet.nrows):
            for col in range(sheet.ncols):
                cell_value = sheet.cell_value(row,col)
                if cell_value == keyword:
                    print('找到关键词!文件名为:', file)

四、三次优化

可以利用sheet.row_values(row)获取每一行的所有值,再判断keyword是不是在这个值列表中。这样做可以节约大约二行代码,减少了一个for循环。

import os 
import xlrd

keyword = '李金斗'
files = [i for i in os.listdir('.') if i.endswith(".xls")]
for file in files:
    workbook = xlrd.open_workbook(file) 
    sheets = workbook.sheets()
    for sheet in sheets:
        for row in range(sheet.nrows):
            if keyword in sheet.row_values(row):
                print('找到关键词!文件名为:', file)

print('未找到关键词')  

五、学后反思

  1. Python在办公自动化方面优势明显,在上面代码中,Python可以遍历文件、工作表、行、列、单元格,人工可能要十分钟完成的任务,它用一秒钟就完成了。
  2. 在读取xlsx文件时,可以考虑用openpyxl,或者是pandas。如果是xls文件则用xlrd这个包,而且我发现xlrd的执行速度比openpyxl要快的多,当然pandas运行速度较慢,但是实现的功能更多。
  3. Claude, ChatGPT在辅助编程方面真的很强大,可以辅助项目开发,节约时间和成本。尤其是在自己没有任何思路的情况下,可以利用它来打开思路,简化工作步骤,提升工作效率。
;