作者是个菜鸡,毕业以后做的功能测试,闲暇时间自学了下Python,记得是前年九月份吧,在校友群遇到了同样的做测试的学妹,学妹公司让做一个判断文件的代码练练手,拿来修改了下,写了我印象中第一个和工作有些关系的脚本。
准备工作:
Python:3.8
xlrd:1.2.0
整体代码:
import time
import xlrd
import threading
#获取所有数据
# 数据形式为[第一行列表格式数据,第二行列表数据......]
def res_one(row,worksheet):
z = [] #创建一个存放数据的列表
for i in range(row):
rowdate = worksheet.row_values(i) # i行的list
z.append(rowdate)
return z
def sayhello(arg):
workxls = xlrd.open_workbook(arg) #使用xlrd模块打开文件
worksheet = workxls.sheet_by_name("Sheet1") #获取sheet1页
row = worksheet.nrows # 获取总行数
for i in range(row): #一行行去判断是否有修改
rowdate = worksheet.row_values(i) # i行的列表数据
for a, b in enumerate(rowdate): #列出数据和数据下标,a为下标,b为数据
# print(i, a, b) # 第i行,a列,数据b
if b != z[i][a]: #是否不同,不同进入判断
print("有修改在:" + str(i + 1) + "行" + str(a + 1) + "列") # 数列从0开始,加1方便阅读
print("被修改值为:" + str(z[i][a]))
print("修改后值为:" + str(b))
print("修改时间为:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
z[i][a] = b # 重置修改地方的数据判断为新的数据
else:
pass #相同略过
t = threading.Timer(1.0, sayhello,[filepath]) #回调定位器,不写只会执行一次sayhello
t.start()
def res(b, c):#对比两个数据是否不同
if (b == c):
return 0
else:
return 1
if __name__ == '__main__':
# filepath= "test.xlsx" #所监控的文件地址可以是相对路径或者绝对路径
filepath= "D:\\code\\python\\untitled\\test.xlsx" #所监控的文件地址可以是相对路径或者绝对路径
workxls = xlrd.open_workbook(filepath) #使用xlrd模块打开文件
worksheet = workxls.sheet_by_name("Sheet1") #获取sheet1页
row = worksheet.nrows # 获取总行数
z = res_one(row,worksheet) #获取所有数据,数据形式为[第一行列表格式数据,第二行列表数据......]
t = threading.Timer(1.0, sayhello,[filepath]) #线程定时器每隔一秒调用一次sayhello函数
t.start() #开启线程
运行效果:
思路:
首先我们要打开Excel文件,我选择的是xlrd。安装方法使用了pip安装也可以在pycharm的设置里安装。注:最新版不支持xlsx所以指定了版本号为1.2.0。命令如下:
pip install xlrd==1.2.0
打开Excel文件获取数据。
if __name__ == '__main__':
# filepath= "test.xlsx" #所监控的文件地址可以是相对路径或者绝对路径
filepath= "D:\\code\\python\\untitled\\test.xlsx" #所监控的文件地址可以是相对路径或者绝对路径
workxls = xlrd.open_workbook(filepath) #使用xlrd模块打开文件
worksheet = workxls.sheet_by_name("Sheet1") #获取sheet1页
row = worksheet.nrows # 获取总行数
定义一个函数来获取所有数据。
def res_one(row,worksheet):
z = [] #创建一个存放数据的列表
for i in range(row):
rowdate = worksheet.row_values(i) # i行的list
z.append(rowdate)
return z
调用该函数。获取所有数据作为之后对比的依据。
z = res_one(row,worksheet) #获取所有数据,数据形式为[第一行列表格式数据,第二行列表数据......]
写一个对比函数对比每一个数据判断是否有变化。
def sayhello(arg):
workxls = xlrd.open_workbook(arg) #使用xlrd模块打开文件
worksheet = workxls.sheet_by_name("Sheet1") #获取sheet1页
row = worksheet.nrows # 获取总行数
for i in range(row): #一行行去判断是否有修改
rowdate = worksheet.row_values(i) # i行的列表数据
for a, b in enumerate(rowdate): #列出数据和数据下标,a为下标,b为数据
# print(i, a, b) # 第i行,a列,数据b
if b != z[i][a]: #是否不同,不同进入判断
print("有修改在:" + str(i + 1) + "行" + str(a + 1) + "列") # 数列从0开始,加1方便阅读
print("被修改值为:" + str(z[i][a]))
print("修改后值为:" + str(b))
print("修改时间为:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
z[i][a] = b # 重置修改地方的数据判断为新的数据
else:
pass #相同略过
t = threading.Timer(1.0, sayhello,[filepath]) #回调定位器,不写只会执行一次sayhello
t.start()
创建线程定时器定时调用,第一个参数为每隔一秒,第二个参数为所调用的函数,第三个为传递个函数的参数。
t = threading.Timer(1.0, sayhello,[filepath]) #线程定时器每隔一秒调用一次sayhello函数
t.start() #开启线程
后记:
第一次写公众号感觉无从下手,分享下我入门的脚本,这个脚本实际工作中我没用到所以有个致命问题我没有修改,这个脚本只适合固定行列的文件监控,如果新增行列会报错数组越界。欢迎读者自行修改,也可以增加通知功能如用smtplib模块发送邮件通知。
立秋了不知道大家有没有喝奶茶。