新学python和pandas,写了一堆屎码,我自己都要吐了
请大神们给出个主意,我在代码后面写了目前存在的问题。我闷头儿写了两天,现在能跑通,可进一步的实在没力气,也没知识储备了。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() # 其实可能没有这个必要。既然还没有,那新生成的就自己做主
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 = # 将以上内容组成个列表
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:
return int(flt)
else:
return float(x)
# def ipt():
i = 1
dTs = []
while i > 0:
dTs.append(inpt()) # 将通过自定义函数审核的输入内容逐次添加到二维列表中
dTs.insert(0,i) # 在每个列表元素(也是个列表)的头部插入序号,为变量i-1
eN = rvw2(input('是否继续入库:').strip()) # 过滤掉空格和回车
if str(eN) 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 # 各列重新排序
df = pd.concat(,axis=0,ignore_index=True)# 数据还是要拼接,不拼接,库存数据无法继承
df['新库存'] = df['入库数量'] + df['原库存']
df['库存金额'] = df['商品价格'] * df['新库存']# df2 * df2['新库存']]会是啥?
# # df=df.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、图形化鼠标操作未解决。
''' class类、面向对象编程、装饰器。。。。这都什么和什么啊?pandas也搞不明白,按groupby聚合的内容提取不出来。。。。我要休息一下了,偏头疼 谢谢分享
哈哈!看不懂! 用python操作数据的读取么 1.不是很简单的多分支判断吗?我看你在代码里已经实现了一大半了啊。还是说你不知道elif语句?就算不知道,直接嵌套一层if也可以啊?
2、3没大看懂你的需求
4.要用到第三方库,自己百度
5.也要第三方库,不过如果你只是自己用没有用户的话,其实图形界面没什么必要 确实思路可以再改变一下 你这样搞也不怕CPU挂喽 培尔金特 发表于 2020-11-22 20:31
1.不是很简单的多分支判断吗?我看你在代码里已经实现了一大半了啊。还是说你不知道elif语句?就算不知道, ...
昨天晚上想了想,确实如你所说。
页:
[1]
2