最近经常去超市,看到超市总有过期的商品清理出来,乡下的超市自动化的程度并不高,商品是否过期检查的程度并不到位,突然想要做一个超市过期商品检索程序,这就是此程序的由来。
做这个程序的时候,首先遇到的难题就是数据的来源,毕竟很多商品存储数据都不外流,再加上做程序就是为了练手,并不需要很准确的数据,找了许久找到了一个拥有150万商品条码库的excel列表,列表中只有条码,商品名称,容量,单位以及生产地几个信息。
总的来说,最起码我的商品基础信息不需要自己随机生成了,接下来就是此程序需要的基础信息了,因为涉及到检测商品是否过期,对商品的检测,后续需要填充的日期就是生产日期和保质期了。
要是填充商品的生产日期和保质期,就需要能够读取和写入excel,这些就涉及到个别库的应用,此类程序网上可以搜到很多,本质上是对于xlwt和xlrt的应用,读取和写入excel的例程如下:
读取部分:
import xlrd
file = 'test.xls'
def read_excel():
wb = xlrd.open_workbook(filename=file)#打开文件
print(wb.sheet_names())#获取所有表格名字
sheet1 = wb.sheet_by_index(0)#通过索引获取表格
print(sheet1)
sheet1 = wb.sheet_by_name('学生')#通过名字获取表格
print(sheet1)
print(sheet1.name,sheet1.nrows,sheet1.ncols)
rows = sheet1.row_values(2)#获取行内容
cols = sheet1.col_values(3)#获取列内容
print(rows)
print(cols)
print(sheet1.cell(1,0).value)#获取表格里的内容,三种方式
print(sheet1.cell_value(1,0))
print(sheet1.row(1)[0].value)
if __name__ == '__main__':#设置为直接调用时运行该部分
read_excel()
写入部分:
#xlx操作笔记1
import xlwt
def set_style(name, height, bold = False):
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = name
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style
def write_excel():
f = xlwt.Workbook()
sheet1 = f.add_sheet('学生',cell_overwrite_ok = True)
row0 = ["姓名", "年龄", "出生日期", "爱好"]
colum0 = ["张三", "李四", "练习python", "小明","小红", "无名"]
for i in range(0,len(row0)):
sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
#写第一列
for i in range(0,len(colum0)):
sheet1.write(i+1,0,colum0[i],set_style('Times New Roman',220,True))
sheet1.write(1,3,'2006/12/12')
sheet1.write_merge(6,6,1,3,'未知')#合并行单元格
sheet1.write_merge(1,2,3,3,'打游戏')#合并列单元格
sheet1.write_merge(4,5,3,3,'打篮球')
f.save('test.xls')
if __name__ == '__main__':#设置为直接调用时运行该部分
write_excel()
本以为这两部分就够用了,结果发现写入程序的使用条件仅限于新建文件的时候,于是就只能继续借用强大的网络,进行再次查找,找到了一个xlutils库:
import xlrd
from xlutils.copy import copy
f = 'F:/python_text/商品日期报告项目/超市商品条码库.xlsx'
rb = xlrd.open_workbook(f)
wb = copy(rb)
ws = wb.get_sheet(1)
ws.write(0,0,'change')
ws.write(8,5,'63')
wb.save(f)
读取和改写的部分解决了,接下来是生产日期的问题,生产日期属于日期的随机生成部分,本来是想建立三个字符组,分别随机调用年月日,后来随便一查,发现time库有日期的生成功能——time.mktime很合适,具体例程如下:
def rand_date():#随机生产日期
start_time = (2020,1,1,0,0,0,0,0,0)#日期起始时间:2020-01-01 00:00:00
end_time = (2021,1,20,23,59,59,0,0,0)#日期结束时间;2021-01-20 23:59:59
start = time.mktime(start_time)
end = time.mktime(end_time)
t = randint(start,end)
date_touple = time.localtime(t)
date = time.strftime("%Y-%m-%d", date_touple)
return date
至于保质期,采用随机选择的方法,从字符组中随机调用,后期又加了商品的库存,分了商场和仓库两个部分,最后得到的程序如下:
#生产日期模拟
from random import randint
from xlutils.copy import copy
import xlrd
import time
f = 'F:/python_text/商品日期报告项目/超市商品条码库.xlsx'
sday_name = ['15天', '一个月', '45天', '两个月', '三个月', '四个月', '半年', '一年', '三年']
def rand_date():#随机生产日期
start_time = (2020,1,1,0,0,0,0,0,0)#日期起始时间:2020-01-01 00:00:00
end_time = (2021,1,20,23,59,59,0,0,0)#日期结束时间;2021-01-20 23:59:59
start = time.mktime(start_time)
end = time.mktime(end_time)
t = randint(start,end)
date_touple = time.localtime(t)
date = time.strftime("%Y-%m-%d", date_touple)
return date
def rand_sdate():#随机生成保质期
return randint(0,8)
def rand_stock():#随机生成库存
return randint(1,100)
def write_date():
rb = xlrd.open_workbook(f)
wb = copy(rb)
ws = wb.get_sheet(0)
for i in range(1,12134):
ws.write(i,6,rand_date())
ws.write(i, 7, sday_name[rand_sdate()])
ws.write(i, 11, rand_stock())#商场存量
ws.write(i, 12, rand_stock())#库房存量
wb.save(f)
write_date()
第一部分到此结束,后期会贴上150万商品条码库的excel。
210616补充条码库链接:
链接:https://pan.baidu.com/s/1-4LWz2txfz9CNKRfjCWhgw
提取码:yucz