[Asm] 纯文本查看 复制代码
import pandas as pd
import numpy as np
import datetime
import os
import re
fn = '食堂窗口售卖表.xlsx'
df0 = pd.DataFrame()
rW0 = ['序号','入库时间','商品ID','商品名称','原库存','入库数量','新库存','商品价格','本次金额','库存金额','说明备注']
rW2 = ['序号','入库时间','商品ID','商品名称','入库数量','商品价格','本次金额','说明备注']
if fn in os.listdir(r'd:/Temp'): # 把已经存在的库存文件数据交给df0,并设置好列标签。
df0 = pd.read_excel('d:/Temp/食堂窗口售卖表.xlsx') # 加“header=1”只是便于观察,并不能建立列索引
# df.reindex(columns=rW0) # 不但没有inplace=True参数,还不能改列标签,却又不报错。
# df0 = pd.DataFrame(df, columns=rW0) # 这样才真正改了列标签
else: # 这几句的目的是如果是第一次运行,没有食堂窗口售卖表.xlsx的话,就创建个DataFrame数据供调用
df1 = pd.DataFrame([rW0]) # 其实可能没有这个必要。既然还没有,那新生成的就自己做主
df0 = pd.DataFrame(df1, columns=rW0)
df0['新库存'] = 0
df0['原库存'] = df0['新库存'] # 中间数据,为了数据拼接时省事
df0['新库存'] = 0 # 中间数据,为了数据拼接时省事
df0['入库数量'] = 0
def inpt(*x): # 收集需输入的内容
nW = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #
iDn = rvw1(str(input('请扫描商品条码:').strip())) # 自定义函数处理扫码,不足规定长度重新扫
# txt.insert('end',iDn) # 将有效扫码结果输出给窗体
nM = rvw2(str(input('请输入商品名称:').strip())) # 自定义函数去除空格和回车,限定输入长度
cNt = int(rvw3(rvw2(input('请输入入库数量:').strip()))) # 自定义函数判断是否为整数
pRc = rvw4(input('请输入商品价格:').strip().replace('。','.')) # 判断是否有浮点数,消除简单失误
# pRc = re.sub(r"[^\w\s\b]+", '.', pRc0) # 正则处理错输的复杂符号错误,未成功
aMnt = float(int(cNt) * pRc) # 计算本次入库物品金额,需转为浮点数
rMk = str(input('说明:')) # 对输入内容无限制
rW3 = [nW, iDn, nM, cNt, pRc, aMnt, rMk] # 将以上内容组成个列表
return rW3
def rvw1(x):
while len(x) != 3:
print('扫码失败,请重新扫码!')
x = str(input('请扫描商品条码:').strip())
return x
def rvw2(x):
while len(x) < 1:
print('此处不能为空!')
x = str(input('请重新输入:').strip())
return x
def rvw3(x):
while not x.isnumeric():
print('入库数量应为整数,请敲回车并重新输入!')
x = rvw2(input('请输入入库数量:').strip())
return x
def rvw4(x):
while bool(re.search(r'\d', x)) != 1:
print('请输入整数或小数,注意小数点是英文半角的“.”,不是中文的“。”')
return rvw4(input('请重新输入商品价格:').strip().replace('。','.'))
flt = re.findall("(\d+)(\.*\d*)", x)
if len(flt[0][1]) == 0:
return int(flt[0][0])
else:
return float(x)
# def ipt():
i = 1
dTs = []
while i > 0:
dTs.append(inpt()) # 将通过自定义函数审核的输入内容逐次添加到二维列表中
dTs[i - 1].insert(0,i) # 在每个列表元素(也是个列表)的头部插入序号,为变量i-1
eN = rvw2(input('是否继续入库:').strip()) # 过滤掉空格和回车
if str(eN[0]) in ['y', 'Y', '是']: # 根据输入内容的第一个字符判断是否结束
i += 1
else:
i = 0
# def sv():
df2 = pd.DataFrame(dTs,columns = rW2) # 把所有输入转换成DataFrame数据体
df2['原库存'] = 0 # 在df2中,均为新输入,df2['原库存']均视为0。如有和df0中的重复项,将专门调整
df2['新库存'] = 0
df2['库存金额'] = 0
df2 = df2[rW0] # 各列重新排序
df = pd.concat([df2,df0],axis=0,ignore_index=True) # 数据还是要拼接,不拼接,库存数据无法继承
df['新库存'] = df['入库数量'] + df['原库存']
df['库存金额'] = df['商品价格'] * df['新库存'] # df2[df2['商品单价'] * df2['新库存']]会是啥?
# # df=df[df.groupby('商品ID')['新库存'].sum] # 想得太简单,groupby还是不太会用
# # # df0.to_excel('d:/Temp/食堂窗口售卖表.xlsx',index=False,columns=False)
# # # df0.to_excel('d:/Temp/食堂窗口售卖表.xlsx',columns=False) # columns=True也不行,没这参数
df.to_excel('d:/Temp/食堂窗口售卖表.xlsx',index=False)
'''
目前问题:
1、退出机制应该设计成按以“y”、“Y”、“是”开头儿的字符串即继续,按“n”、“N”、“不”开头儿的字符串退出,其它字符询问;
2、当次输入有重值未解决;groupby还没学会。
3、当次输入与原库存有相同项未解决;
4、语音提示未解决;
5、图形化鼠标操作未解决。
'''