网站建设属于什么资产,网络营销有哪些就业岗位,设计在线官网作品欣赏,wordpress快速翻译问题背景
有表A#xff0c;其数据如下 关键信息是邮寄地址和单号。
表B#xff1a; 关键信息是运单号和重量 我们需要做的是#xff0c;对于表A中的每一条数据#xff0c;根据其单号#xff0c;在表B中查找到对应的重量。 在表A中新增一列重量#xff0c;将刚才查到的…问题背景
有表A其数据如下 关键信息是邮寄地址和单号。
表B 关键信息是运单号和重量 我们需要做的是对于表A中的每一条数据根据其单号在表B中查找到对应的重量。 在表A中新增一列重量将刚才查到的数据填在该列。 更近一步地会再提供一张价格表
我们需要根据表A的邮寄地址和刚得到的重量计算该订单的运费。 同样在表A中新增一列运费将计算得到的运费填写在该列。
准备工作
建立一个文件夹在该文件夹下再建立三个文件夹分别是origin、query和result里面分别放表A可以放多个表、表B也可以放多个表result放的是最终的结果。
其它细节
1、可以发现有些单号为空的行被折叠了为了保持原样所以我们会添加一列collapse如果订单号为空就设置collapse为1否则为空。之后再根据collapse这列折叠单号为空的行后面会介绍。 2、会存在一些在表B中找不到重量信息的订单号这些订单将被输出在命令行窗口。 3、也可以处理有多个sheet的表。
代码
import os
import re
import pandas as pd
import cpca
import math# 将所有待处理的文件都保存在这个路径下
ROOT_DIR /Users/XXX/Desktop/OrderProcessing/
# 所有结果将保存在这个路径下
SAVE_DIR /Users/XXX/Desktop/OrderProcessing/result/# 参照此格式三个数字分别表示0.5kg首重续重。
# 注意省份名称一定要规范。不过不要求Excel表格中的邮寄地址必须要规范。
COST_TABLE_ORIGIN {江苏省: [1, 3, 1],浙江省: [1, 3, 1],上海市: [1, 3, 1],安徽省: [1, 3, 1],舟山市: [1, 3, 1]}def calc_cost(province, city, weight, cost_table):根据地区和重量计算运费:param province: 省份:param city: 城市:param weight: 重量:param cost_table: 价格表:return: 价格costs Noneadditional 0if str(province) in 北京市 or str(province) in 上海市:additional 1for p, cost in cost_table.items():if str(city) in p:costs costif costs is None:for p, cost in cost_table.items():if str(province) in p:costs costif costs is None:print( 计算费用时发生错误可能是价格表中没有对应的地区)return Noneif weight 0.5:return costs[0] additionalelif weight 1:return costs[1] additionalelse:return costs[1] math.ceil(weight - 1) * costs[2] additionaldef query_weight_by_order(file_name, order, order_str运单号, weight_str重量):根据订单号查询重量:param file_name: 去哪个文件里查找:param order: 订单号:param order_str: 订单的列名:param weight_str: 重量的列名:return: 该订单的重量df pd.read_excel(iofile_name)num_rows len(df.index.values)weight Nonefor row in range(num_rows):if str(df.iloc[row][order_str]) order:weight df.iloc[row][weight_str]breakreturn weightdef add_weight(read_file_name, write_file_name, sheet_nameNone, collapse_flagTrue):添加重量信息:param read_file_name: 读取文件:param write_file_name: 写入文件:param sheet_name: 工作表名称:param collapse_flag: 是否隐藏指定行比如某项值为空则隐藏该行:return:if sheet_name is None:df pd.read_excel(ioread_file_name)writer pd.ExcelWriter(write_file_name)else:df pd.read_excel(ioread_file_name, sheet_namesheet_name)# 这样写好像有点笨if os.path.exists(write_file_name):writer pd.ExcelWriter(write_file_name, modea)else:writer pd.ExcelWriter(write_file_name, modew)num_rows len(df.index.values)if 单号 not in df.columns.values:print( 没有单号这一列请确保单号那列的列名为单号)writer.close()returnfor row in range(num_rows):order str(df.loc[row, 单号])像order这一列如果全是正常的单号读进来会是浮点数比如78649717XXX259.0如果有几行是停发读进来的就都是不带小数点的了比如78XXX17332259空值就是显示nanif order nan or order 停发: # pd.isnull(order)if order nan and collapse_flag: # 若订单号为空则标记隐藏该行df.loc[row, collapse] 1continue# 到这里的就是带小数点的订单号或者正常的不带小数点的订单号if order[-2] .: # 去除小数点order order[:-2]# df.loc[row, 单号] order# 有可能写了多个订单号比如786497173XXX978649719X80XX0786497X799ZXX4# 这种情况下就把多个订单的重量进行累加orders re.split(||\n| |,|;, order)weight 0for o in orders:if len(o) 0:continuew None这里就是根据订单的不同查询不同的表比如Y开头的查哪个表数字开头的查哪个表此处需要自定义if o[0] Y:# 根据订单号查询重量w query_weight_by_order(ROOT_DIR query/A.xlsx, o, order_str运单号码, weight_str计费重量kg)elif 0 o[0] 9:w query_weight_by_order(ROOT_DIR query/B.xlsx, o)if w is not None and (isinstance(w, float) or isinstance(w, int)):weight welse:print( 没有找到该订单的重量数据 o)if weight 0:df.loc[row, 重量] weight# 格式化地址信息address cpca.transform([df.loc[row, 邮寄地址]])# 计算运费cost calc_cost(address.loc[0, 省], address.loc[0, 市], weight, COST_TABLE_ORIGIN)if cost is None:print( 发生错误的订单号为, order)continueelse:df.loc[row, 运费] costif sheet_name is None:df.to_excel(writer, indexFalse)else:df.to_excel(writer, indexFalse, sheet_namesheet_name)writer.close()
TODO:
1、修改ROOT_DIR和SAVE_DIR
2、将所有待处理的xlsx文件保存在ROOT_DIR/origin路径下查询表保存在ROOT_DIR/query路径下
2、修改查询订单重量的代码只需要简单地填写文件名关键的列名等
3、修改价格表并在调用calc_cost方法的地方指定价格表if __name__ __main__:if not os.path.exists(ROOT_DIR):print(ROOT_DIR 不存在)exit()if not os.path.exists(SAVE_DIR):print(创建目录 SAVE_DIR)os.mkdir(SAVE_DIR)else:ans input(是否删除%s下的所有文件Y/N: % SAVE_DIR)if ans Y:# 删除该目录下的所有文件for filename in os.listdir(SAVE_DIR):os.remove(SAVE_DIRfilename)print(已删除SAVE_DIR下的所有文件)print(开始处理)for filename in os.listdir(ROOT_DIRorigin/):if filename[0] . or filename[-4:] ! xlsx: # 去除隐藏文件和非xlsx文件continueprint(正在处理 filename)xlsx pd.ExcelFile(ROOT_DIR origin/ filename)sheet_names xlsx.sheet_namesxlsx.close() # 不知道是不是需要for sheet_name in sheet_names:print( 正在处理, sheet_name)add_weight(ROOT_DIR origin/ filename, SAVE_DIR filename, sheet_name)print(处理完毕)
处理结果 然后我们需要根据collapse列来折叠单号为空的行。 这个我还不知道怎么通过pandas实现现在就只能先通过Excel自带的功能处理。 比如Mac版的WPS是这么处理的 1、选中collapse列 2、按commandG。按下图设置
3、点击定位
可以发现collapse为1的行被选中了 4、点击command9。单号为空的行就被折叠了 5、然后再删除collapse这列就行了 最终结果
命令行窗口输出
是否删除/Users/XXX/Desktop/OrderProcessing/result/下的所有文件Y/N:Y
已删除SAVE_DIR下的所有文件
开始处理
正在处理table1.xlsx正在处理 Sheet1正在处理 Sheet2
正在处理A.xlsx正在处理 AA没有找到该订单的重量数据中通:786XXXX23没有找到该订单的重量数据786X5780XX37没有找到该订单的重量数据合在一起打包没有找到该订单的重量数据786493XX3783158正在处理 AB计算费用时发生错误可能是价格表中没有对应的地区发生错误的订单号为 78649XXX184656计算费用时发生错误可能是价格表中没有对应的地区发生错误的订单号为 786497XXX08769没有找到该订单的重量数据786X979XX8226没有找到该订单的重量数据5箱没有找到该订单的重量数据直发正在处理 AC正在处理 AD没有找到该订单的重量数据YT699X121XX068没有找到该订单的重量数据YT6993X9X987155没有找到该订单的重量数据786499616XXX08没有找到该订单的重量数据YT6XXX875919847没有找到该订单的重量数据786497XXX57489正在处理 AE没有单号这一列请确保单号那列的列名为单号
处理完毕Process finished with exit code 0 文章转载自: http://www.morning.lqlhw.cn.gov.cn.lqlhw.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.bnmrp.cn.gov.cn.bnmrp.cn http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn http://www.morning.rzdpd.cn.gov.cn.rzdpd.cn http://www.morning.qjsxf.cn.gov.cn.qjsxf.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.reababy.com.gov.cn.reababy.com http://www.morning.rbzd.cn.gov.cn.rbzd.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.mknxd.cn.gov.cn.mknxd.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.xlpdm.cn.gov.cn.xlpdm.cn http://www.morning.jmmz.cn.gov.cn.jmmz.cn http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.pzlcd.cn.gov.cn.pzlcd.cn http://www.morning.dzrcj.cn.gov.cn.dzrcj.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.smrkf.cn.gov.cn.smrkf.cn http://www.morning.ryfq.cn.gov.cn.ryfq.cn http://www.morning.xkqjw.cn.gov.cn.xkqjw.cn http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn http://www.morning.snnwx.cn.gov.cn.snnwx.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.stcds.cn.gov.cn.stcds.cn http://www.morning.mqss.cn.gov.cn.mqss.cn http://www.morning.mrccd.cn.gov.cn.mrccd.cn http://www.morning.krhkb.cn.gov.cn.krhkb.cn http://www.morning.pfnwt.cn.gov.cn.pfnwt.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.prlgn.cn.gov.cn.prlgn.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn http://www.morning.nbhft.cn.gov.cn.nbhft.cn http://www.morning.htjwz.cn.gov.cn.htjwz.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.rysmn.cn.gov.cn.rysmn.cn http://www.morning.nqypf.cn.gov.cn.nqypf.cn http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn http://www.morning.cjsnj.cn.gov.cn.cjsnj.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.pntzg.cn.gov.cn.pntzg.cn http://www.morning.jwskq.cn.gov.cn.jwskq.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.gctgc.cn.gov.cn.gctgc.cn http://www.morning.pwfwk.cn.gov.cn.pwfwk.cn http://www.morning.xxlz.cn.gov.cn.xxlz.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.mbfkt.cn.gov.cn.mbfkt.cn http://www.morning.kzdwt.cn.gov.cn.kzdwt.cn http://www.morning.gblrn.cn.gov.cn.gblrn.cn http://www.morning.flxqm.cn.gov.cn.flxqm.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.kcdts.cn.gov.cn.kcdts.cn http://www.morning.gpcy.cn.gov.cn.gpcy.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.rlzxr.cn.gov.cn.rlzxr.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.tsycr.cn.gov.cn.tsycr.cn http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn http://www.morning.szoptic.com.gov.cn.szoptic.com http://www.morning.mkfhx.cn.gov.cn.mkfhx.cn http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn http://www.morning.mxptg.cn.gov.cn.mxptg.cn http://www.morning.wknj.cn.gov.cn.wknj.cn http://www.morning.qhrsy.cn.gov.cn.qhrsy.cn http://www.morning.qlckc.cn.gov.cn.qlckc.cn http://www.morning.xbbrh.cn.gov.cn.xbbrh.cn http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn http://www.morning.srky.cn.gov.cn.srky.cn