这个程序每天用一个小时的空闲时间,一共花了我近一个星期进行初步设计,我的程序创作思路很简单,先做好程序要实现的初步目标然后再进行改进,下面是我的程序初步设计,要求如下:
1.求取商品的保质期
2.求取商品的大日期范围
3.求取商品大日期开始时间
4.求出过期商品的条形目录
这里,需要了解一点知识,什么是商品的大日期?大日期的时间该如何确定?从网上搜索,我获得了以下信息:
- 食品 保质 期 为 一 年 以 上 的 , 期 满 之 日 前 45 天 ;
- 保质 期 为 半年 以 上 不 足 一 年 的 , 期 满 之 日 前 20 天 ;
- 保质 期 90 天 以 上 不 足 半 年 的 , 期 满 之 日 前 15 天 ;
- 保质 期 30 天 以 上 不 足 90 天 的 , 期 满 之 日 前 10 天 ;
- 保质 期 16 天 以 上 不 足 30 天 的 , 期 满 之 日 前 5 天 ;
- 保质 期 少 于 15 天 的 , 期 满 之 日 前 1 至 4 天 。
然后,enmmm,非常抱歉,到这里有点失去节奏了,因为这篇文章与之前相隔近半年,上面的内容是之前村的草稿,所以我就长话短说,思路简略了,对于步骤一,就是在做加减法,这个其实很简单,只需要好好运用python的库文件,就可以轻松的解决日期的加减问题,我选择的是datetime和dateutil的相关库文件,然后按照步骤先计算保质期,再计算临期商品开始的时间,相关信息再写入表格当中,相关操作代码如下:
def end_time(date_date,save_day_pl):#保质期至
date1 = parse(date_date)
if save_day_pl == 0 or save_day_pl == 2:
return (date1 + relativedelta(days = save_day[save_day_pl]))
else:
return (date1 + relativedelta(months = save_day[save_day_pl]))
def begin_time(hand_time,end_t):#临期商品开始时间
return (end_t - relativedelta(days = hand_time))
第四步就很好实现了,完整代码如下:
#大日期商品输出
#食品 保质 期 为 一 年 以 上 的 , 期 满 之 日 前 45 天 ;
#保质 期 为 半年 以 上 不 足 一 年 的 , 期 满 之 日 前 20 天 ;
#保质 期 90 天 以 上 不 足 半 年 的 , 期 满 之 日 前 15 天 ;
#保质 期 30 天 以 上 不 足 90 天 的 , 期 满 之 日 前 10 天 ;
#保质 期 16 天 以 上 不 足 30 天 的 , 期 满 之 日 前 5 天 ;
#保质 期 少 于 15 天 的 , 期 满 之 日 前 1 至 4 天 。
from random import randint
from xlutils.copy import copy
import xlrd
import time
import datetime
from dateutil.parser import *
from dateutil.relativedelta import *#1Year2.Month3.Day4.Hours5.Minutes6.Seconds7.Microseconds
f = 'F:/python_text/商品日期报告项目/超市商品条码库.xlsx'
save_day = {0:15, 1:1, 2:45, 3:2, 4:3, 5:4, 6:6, 7:12, 8:36}
sday_name = ['15天', '一个月', '45天', '两个月', '三个月', '四个月', '半年', '一年', '三年']
big_thing = {0:"商品条码 商品名称 库存量 上架货物"}
over_thing = {0:"商品条码 商品名称 库存量 上架货物"}
def handle_time(save_day_pl):#大日期范围
if save_day_pl == 0:
big_time = 4
#elif save_day_pl == 1:
# big_time = 5
elif save_day_pl < 3:
big_time = 10
elif save_day_pl < 6:
big_time = 15
elif save_day_pl < 7:
big_time = 20
elif save_day_pl <= 8:
big_time = 45
return big_time
def end_time(date_date,save_day_pl):#保质期至
date1 = parse(date_date)
if save_day_pl == 0 or save_day_pl == 2:
return (date1 + relativedelta(days = save_day[save_day_pl]))
else:
return (date1 + relativedelta(months = save_day[save_day_pl]))
def begin_time(hand_time,end_t):#临期商品开始时间
return (end_t - relativedelta(days = hand_time))
def read_code():
wei1 = 1
wei2 = 1
rb = xlrd.open_workbook(f)
sheet1 = rb.sheet_by_index(0)
wb = copy(rb)
ws = wb.get_sheet(0)
now_time = input("请输入日期(如;2020-1-1):\n")
now_time = parse(now_time)
for i in range(1,12134):
date_date = sheet1.cell(i,6).value
sa_day = sheet1.cell(i,7).value
save_day_pl = sday_name.index(sa_day)
hand_time = handle_time(save_day_pl)
ws.write(i,8,hand_time)
end_t = end_time(date_date,save_day_pl)
ws.write(i,9,end_t.strftime("%Y-%m-%d"))
b_time = begin_time(hand_time,end_t)
ws.write(i,10,b_time.strftime("%Y-%m-%d"))
if now_time >= b_time and now_time <= end_t:
big_thing[wei1] = (str(int(sheet1.cell(i,0).value)) + " "
+ str(sheet1.cell(i,1).value) + " "
+ str(int(sheet1.cell(i,11).value)) + " "
+ str(int(sheet1.cell(i,12).value)))
wei1 += 1
if now_time > end_t:
over_thing[wei2] = (str(int(sheet1.cell(i,0).value)) + " "
+ str(sheet1.cell(i,1).value) + " "
+ str(int(sheet1.cell(i,11).value)) + " "
+ str(int(sheet1.cell(i,12).value)))
wei2 += 1
print(big_thing[wei1-1])
print(wei1,wei2,len(big_thing))
wb.save(f)
read_code()
"""print("大日期商品如下:")
for i in big_thing:
print(big_thing[i])
print("过期商品如下:")
for i in over_thing:
print(over_thing[i])"""
设计代码并没有特别难,难的是整个设计流程,一不小心就容易跑偏,整个代码设计在半年之后的我看来非常差,但是半年前的时候设计出来非常开心,所以,我的代码仅供参考,如果说是有学习想法的人看到了我的分享代码,千万要记住,仅供参考,还是设计自己的代码更能学习到东西。