您的位置:澳门402永利com > 编程应用 > 使用stub进行快速迭代开发,提取excel表数据成j

使用stub进行快速迭代开发,提取excel表数据成j

发布时间:2019-09-27 02:13编辑:编程应用浏览(86)

    支出那边的供给

    这段时间趋向于前台和后台分层开垦


    前边叁个调用后台接口获取数据,然后在页面展现.

    1、武功杜洞尕以及阿狸布塔散文都是属于剧集的。意思正是有相当多集,这里称她们为tv
    最下边这几行第一列没名字的都以单集的,这里称它们为mv
    亟需总计全部专门的学业表里面包车型客车数量把tv放八个大的json里面
    把mv放三个大的json里面

    而是一时前台(静态财富)和后台联调时很麻烦:

    2、须求研究图片名列。然后检查测量检验文件夹里面是还是不是有对应的图形。
    再者把图纸提取首字母并生成新文件名
    比如
    武术大浣熊.jpg 会产生 tv_gfxm.jpg
    必备古诗.jpg 会产生 mv_gfxm.jpg

    (1)后台信任合作方,里面包车型客车内容很难遍历各样情况;

    图片 1

    (2)后台的多少修改起来很麻烦,因为大家没有办法直接改变数据库,因为数据库在同盟方这里.

    上边是终极效果图
    那是单个mv的多少和字段

     

    图片 2

    因而笔者想到了贰个消除情势:stub

    下边是四个tv

    stub,说白了,正是造假数据

    图片 3

     当然假数据切合合营方的API文书档案标准

    功能完毕

     因为日常来说状态下,供给出来后,合营方接口正在开采,可是大家利用需求调用合作方接口举办支付


     不过总不能够等着他们支付完结吗

    这里没动用到uuid。本来想把它看成二个key的。后边开采无需

     所以让她们先出API文书档案,然后大家依照API文书档案搞假数据来支付

    # -*- coding: utf-8 -*-import xlrdimport uuidimport re,time,json,shutil,os#临时存放所有单集mv_list=[]#临时存放剧集,后面调用format_tv方法存成tv_dicttv_list=[]#tv_dict是所有剧集,key是首字母缩写,值是列表,列表每个元素是剧集的一行tv_dict={}#图片集合,后期用来给图片重命名使用pic_list=[]exec_log=open('执行日志.log','a',encoding='utf-8')# 追加模式error_log=open('错误日志.log','a',encoding='utf-8')# 追加模式#获取excel表中需要提取的视频文件名列表,返回值是个excel句柄def OpenExcel(excel_file):    try:        dataHandle = xlrd.open_workbook(excel_file)        return dataHandle    except Exception as ex:        print        error_log.write('打开excel表失败,可能---'+excel_file+'---并不存在n')        error_log.close()        exit#读取excel数据def ReadExcel(excel_file):    workbook=OpenExcel(excel_file)    exec_log.write("正在读取excel表内容")    print('打印所有sheet:', workbook.sheet_names    #工作表个数    sheet_name_list=workbook.sheet_names()    sheet_count=len(workbook.sheet_names    print("excel表sheet个数:",sheet_count)    exec_log.write("准备循环excel每个工作表..n")    for i in range(sheet_count):        current_sheet = workbook.sheet_by_index  # sheet索引从0开始        rows_num = current_sheet.nrows        cols_num = current_sheet.ncols        print("当前sheet的名字是:%s  行数:%s   列数:%s:"%(sheet_name_list[i],rows_num,cols_num))        print("#####################################################")        for r in range(1,rows_num):            # 一行数据的实体            entity_dict = {}            for c in range(0,cols_num):                cell_value=get_value_and_get_int(current_sheet,r,c)                #这里如果单元格内容为空或者是None的话,再次判断是是否属于合并单元格                if (cell_value is None or cell_value == ''):                    cell_value = (get_merged_cells_value(current_sheet, r, c))                the_key = 'colnum' + str                entity_dict[the_key] = cell_value            #第7列判断是否有空格            if entity_dict["colnum7"] is None or entity_dict['colnum7'] == '':                error_log.write("遇到图片所在列为空值的情况,无法对空值处理,格式异常位置为,3秒后退出n")                exec_log.write("当前sheet的名字是:%s  行数:%s "%(sheet_name_list[i],r))                exec_log.close()                print("遇到图片所在列为空值的情况,无法对空值处理,格式异常位置为,3秒后退出")                print("当前sheet的名字是:%s  行数:%s "%(sheet_name_list[i],r))                time.sleep                exit            #第7列去掉空格,因为要把图片转成首字母            entity_dict["colnum7"].replace            if entity_dict['colnum1'] is None or entity_dict['colnum1'] == '':                mv_list.append(entity_dict)            else:                tv_list.append(entity_dict)    exec_log.write("循环所有工作表完毕,已经追加到单集列表和剧集列表..暂未生成图片列n")#处理单元格值中的int类型,因为xlrd模块会把int自动转成了float,再改回去def get_value_and_get_int(sheet,r,c):    cell_value = sheet.row_values[c]    # 这由于xlrd会把int类型自动转存float,这里做一个处理,把它再转回int类型    cell_type = sheet.cell.ctype  # 表格的数据类型    if cell_type == 2 and cell_value % 1 == 0.0:  # ctype为2且为浮点        cell_value = int(cell_value)  # 浮点转成整型    return cell_value#找到所有合并单元格的坐标def get_merged_cells:    """    获取所有的合并单元格,格式如下:    [(4, 5, 2, 4), (5, 6, 2, 4), (1, 4, 3, 4)]    (4, 5, 2, 4) 的含义为:行 从下标4开始,到下标5  列 从下标2开始,到下标4,为合并单元格    :param sheet:    :return:    """    return sheet.merged_cells# 获取单元格的值def get_merged_cells_value(sheet, row_index, col_index):    """    先判断给定的单元格,是否属于合并单元格;    如果是合并单元格,就返回合并单元格的内容    :return:    """    merged = get_merged_cells    for (rlow, rhigh, clow, chigh) in merged:        if (row_index >= rlow and row_index < rhigh) and (col_index >= clow and col_index < chigh) :            cell_value = sheet.cell_value(rlow, clow)            # print('该单元格[%d,%d]属于合并单元格,值为[%s]' % (row_index, col_index, cell_value))            return cell_value            # print(cell_value)    # return Nonedef getUUID():    return uuid.uuid1().hex#去除标点符号def remove_punctuation:    new_str=re.sub('[^wu4e00-u9fff]+', '',str)    return new_str#获取单个汉字的首字母def single_get_first:    str1 = unicode1.encode    try:        ord        return str1    except:        asc = str1[0] * 256 + str1[1] - 65536        if asc >= -20319 and asc <= -20284:            return 'a'        if asc >= -20283 and asc <= -19776:            return 'b'        if asc >= -19775 and asc <= -19219:            return 'c'        if asc >= -19218 and asc <= -18711:            return 'd'        if asc >= -18710 and asc <= -18527:            return 'e'        if asc >= -18526 and asc <= -18240:            return 'f'        if asc >= -18239 and asc <= -17923:            return 'g'        if asc >= -17922 and asc <= -17418:            return 'h'        if asc >= -17417 and asc <= -16475:            return 'j'        if asc >= -16474 and asc <= -16213:            return 'k'        if asc >= -16212 and asc <= -15641:            return 'l'        if asc >= -15640 and asc <= -15166:            return 'm'        if asc >= -15165 and asc <= -14923:            return 'n'        if asc >= -14922 and asc <= -14915:            return 'o'        if asc >= -14914 and asc <= -14631:            return 'p'        if asc >= -14630 and asc <= -14150:            return 'q'        if asc >= -14149 and asc <= -14091:            return 'r'        if asc >= -14090 and asc <= -13119:            return 's'        if asc >= -13118 and asc <= -12839:            return 't'        if asc >= -12838 and asc <= -12557:            return 'w'        if asc >= -12556 and asc <= -11848:            return 'x'        if asc >= -11847 and asc <= -11056:            return 'y'        if asc >= -11055 and asc <= -10247:            return 'z'        return ''#获取每个汉字每个首字母并返回英文首字母字符串def getPinyin:    if str==None:        return None    str_list = list    charLst = []    for item in str_list:        charLst.append(single_get_first    return  ''.join#拷贝文件def copy_file(source_file,target_file):    if os.path.exists(source_file) and not os.path.exists(target_file):        shutil.copy(source_file,target_file)    else:        error_log.write("下面路径文件不存在: %sn"%(source_file))        print("下面路径文件不存在: %s"%(source_file))        time.sleep#处理图片列表[[pic1,tar1],[pic2,tar2],去重并且调用拷贝文件方式拷贝为新文件def copy_file_from_list:    #对列表去重,这里无法使用set,因为set无法对子元素为列表的元素做hash    new_pic_list=[]    for item in pic_list:        if item not in new_pic_list:           new_pic_list.append    for item in new_pic_list:        copy_file(item[0],item[1])#给单集新增加一列key,值是图片列的英文首字母加上路径名拼接字符串,比如"excel_pic_dir/mv_hj.jpg" 这种格式def add_pic_col_for_mv:    exec_log.write("给单集列表生成图片路径列excel_pic_dir/mv_hj.jpg 这种格式n")    for item in mv_list:        #格式化汉字字符串,去掉特殊符号        temp_str=remove_punctuation(item['colnum7'])        #获取首字母字符串        temp_letter=getPinyin        # print(item['colnum7'])        # temp_letter=getPinyin(temp_letter)        # temp_letter=getPinyin(item['colnum7'])        # print(temp_letter)        #拼接为图片路径,一个放到图片集合中给后面重命名使用,一份直接增加到excel行字典中        source_file="excel_pic_dir/"+temp_str+".jpg"        target_file="excel_pic_dir/mv_"+temp_letter+".jpg"        pic_list.append([source_file,target_file])        # copy_file(source_file,target_file)        item["pic_path"]=target_file    exec_log.write("给单集列表生成图片路径列完毕n")#给剧集新增加一列key,值是图片列的英文首字母加上路径名拼接字符串,比如"excel_pic_dir/tv_hj.jpg" 这种格式def add_pic_col_for_tv:    exec_log.write("给剧集列表生成图片路径列excel_pic_dir/mv_hj.jpg 这种格式n")    for item in tv_list:        #格式化汉字字符串,去掉特殊符号        temp_str=remove_punctuation(item['colnum7'])        #获取首字母字符串        temp_letter=getPinyin        #拼接为图片路径        source_file="excel_pic_dir/"+temp_str+".jpg"        target_file="excel_pic_dir/tv_"+temp_letter+".jpg"        #拼接为图片路径,一个放到图片集合中给后面重命名使用,一份直接增加到excel行字典中        pic_list.append([source_file,target_file])        # copy_file(source_file,target_file)        # temp_path="excel_pic_dir/tv_"+temp_letter+".jpg"        item["pic_path"]=target_file    exec_log.write("给剧集列表生成图片路径列完毕n")#把剧集的都放在一个字典中,key是剧集首字母,value是剧集列表def format_tv:    # tv_dict={}    exec_log.write("把剧集的都放在一个大字典中,key是剧集首字母,value是剧集列表n")    for tv_item in tv_list:        #先获取字符串,去掉标点符号        temp_str=remove_punctuation(tv_item['colnum1'])        #获取首字母字符串        temp_key=getPinyin        if temp_key in tv_dict:            tv_dict[temp_key].append        else:            tv_dict[temp_key]=[]            tv_dict[temp_key].append    exec_log.write("把剧集的都放在一个大字典中完毕n")if __name__ == "__main__":    ReadExcel("001.xlsx")    # print(mv_list[0])    add_pic_col_for_mv    add_pic_col_for_tv    format_tv    copy_file_from_list    print("单集个数:",len    print("剧集套数:",len# print(mv_list[0])# for k,v in tv_dict.items():#     print#     break#获取单集最终字典列表programMovieList=[]for item in mv_list:    new_item={}    new_item["programName"]=item["colnum3"]    new_item["programYear"]=""    new_item["programType"]=""    new_item["programDirector"]=""    new_item["programActor"]=""    new_item["programPoster"]=item["pic_path"]    new_item["programIntroduce"]=item["colnum5"]    new_item["sitnum"]=0    new_item["code"]=item["colnum2"]    new_item["cpCode"]=item["colnum6"]    programMovieList.appendexec_log.write("单集最终字典列表获取完毕n")exec_log.write("开始dump---单集---数据到json文件中n")with open('mv.json', 'w',encoding='utf-8') as f_mv:    json.dump(programMovieList, f_mv,ensure_ascii=False,sort_keys=True, indent=4)exec_log.write("dump---单集---数据完毕n")print("dump---单集---数据完毕..")time.sleepdef get_seriesList(item_list):    seriesList=[]    for item in item_list:        new_item={}        new_item["programName"]=item["colnum3"]        new_item["code"]=item["colnum2"]        seriesList.append    return seriesList#获取剧集最终字典列表programTvList=[]for item in tv_dict:    new_item={}    # print    new_item["programName"]=tv_dict[item][0]["colnum1"]    new_item["programYear"]=""    new_item["programType"]=""    new_item["programDirector"]=""    new_item["programActor"]=""    new_item["programPoster"]=tv_dict[item][0]["pic_path"]    new_item["programIntroduce"]=tv_dict[item][0]["colnum5"]    new_item["sitnum"]=len(tv_dict[item])    new_item["cpCode"]=tv_dict[item][0]["colnum6"]    new_item["recommend"]=""    new_item["seriesList"]=get_seriesList(tv_dict[item])    programTvList.append    # for k,v in new_item.items():    #     print("""+k+""",v)#indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅。    # with open('data.json', 'w',encoding='utf-8') as f:    #     json.dump(new_item, f,sort_keys=True, indent=4)exec_log.write("开始dump---剧集---数据到json文件中n")with open('tv.json', 'w',encoding='utf-8') as f_tv:    json.dump(programTvList, f_tv,ensure_ascii=False,sort_keys=True, indent=4)exec_log.write("dump---剧集---数据完毕n")print("dump---剧集---数据完毕..")print("程序执行完毕,2秒后退出..")error_log.close()exec_log.close()time.sleep
    

    先看下作者是怎么样操作的.

      

    我使用JMeter举办接口测验
    图片 4
     实践结果如下:
    图片 5  

    终极打包成exe交给开荒那边

    然而,你们知道重回的数目来源哪儿吗?

    把利用验证告诉开荒就能够

    源于于如下文件:
    图片 6
     orderContent.json的开始和结果正是回去结果:
    图片 7  

    图片 8

    故而您想要再次回到什么内容,就能够直接修改对应的.json 文件.

    图片 9

     

    图片 10

    规范:

    图片 11

    比如你会见路线:/tv_mobile/stub/appstore/orderContent

    运作结果

    那就是说stub目录上面自然有三个文书夹叫appstore,appstore 上边自然有三个文本orderContent.json

    图片 12

    再例如您寻访路线:/tv_mobile/stub/orgList

    图片 13

    那正是说stub目录下边自然有一个文书叫orgList.json

    图片 14

     

    图片 15

    项目接纳spring MVC 框架

    图片 16

    中央调节器:

    图片 17

    package com.web.controller.comm;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.common.util.SystemHWUtil;
    import com.common.util.WebServletUtil;
    import com.io.hw.file.util.FileUtils;
    import com.util.JSONPUtil;
    
    /***
     * 用于stub
     * 
     * @author huangweii 2015年5月29日
     */
    @Controller
    @RequestMapping("/stub")
    public class StubController {
        protected Logger logger = Logger.getLogger(this.getClass());
        public static final String stub_folder = "stub/";
        public static final String stub_file_Suffix = ".json";
    
        /***
         * 
         * @param request
         * @param action
         * @param callback
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String corsJsonSimple(HttpServletRequest request,
                @PathVariable String action, String callback) {
            String content = null;
            content = stub(request, stub_folder + action + stub_file_Suffix);
            return JSONPUtil.getJsonP(content, callback);
        }
    
        /***
         * 
         * @param request
         * @param namespace
         * @param action
         * @param callback
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String corsJsonSimple(HttpServletRequest request,
                @PathVariable String namespace, @PathVariable String action,
                String callback) {
            String content = null;
            content = stub(request, stub_folder + namespace + "/" + action
                    + stub_file_Suffix);
            return JSONPUtil.getJsonP(content, callback);
        }
        private String stub(HttpServletRequest request, String path) {
            return stub(request, path, SystemHWUtil.CURR_ENCODING);
        }
        /***
         * 读取文件
         * @param request
         * @param path
         * @param charset
         * @return
         */
        private String stub(HttpServletRequest request, String path,String charset) {
            String content = null;
            try {
                String realPath2 = WebServletUtil.getRealPath(request, path);
                java.io.InputStream input = new FileInputStream(realPath2);
                content = FileUtils.getFullContent2(input,charset);
            } catch (java.io.FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return content;
        }
    
    }
    

     

    主干措施:

    /**
         * 获取相对地址的绝对地址
         * 
         * @param request
         * @param relativePath
         * @return
         */
        public static String getRealPath(HttpServletRequest request, String relativePath) {
            return request.getSession().getServletContext().getRealPath(relativePath);
        }
    

     

     --------调控器更新了 贰零壹陆-01-24--------

    package oa.web.controller.common;
    
    import com.common.util.SystemHWUtil;
    import com.common.util.WebServletUtil;
    import com.io.hw.file.util.FileUtils;
    import com.io.hw.json.HWJacksonUtils;
    import com.string.widget.util.ValueWidget;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    /***
     * 用于stub
     *
     * @author huangweii 2015年5月29日
     */
    @Controller
    @RequestMapping("/stub")
    public class StubController {
        public static final String stub_folder = "stub/";
        public static final String stub_file_Suffix = ".json";
        protected Logger logger = Logger.getLogger(this.getClass());
    
        /***
         * @param request
         * @param action
         * @param callback
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String corsJsonSimple(HttpServletRequest request,
                                     @PathVariable String action, String callback, String charset) {
            return stubAction(request, stub_folder + action + stub_file_Suffix, callback, charset);
        }
    
        /***
         * @param request
         * @param namespace
         * @param action
         * @param callback
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String corsJsonSimple(HttpServletRequest request,
                                     @PathVariable String namespace, @PathVariable String action,
                                     String callback
                , String charset) {
            return stubAction(request, stub_folder + namespace + "/" + action
                    + stub_file_Suffix, callback, charset);
        }
    
        private String stubAction(HttpServletRequest request, String actionPath, String callback, String charset) {
            if (ValueWidget.isNullOrEmpty(charset)) {
                charset = SystemHWUtil.CURR_ENCODING;
            }
            String content = stub(request, actionPath, charset);
            logger.info(SystemHWUtil.CRLF + content);
            return HWJacksonUtils.getJsonP(content, callback);
        }
    
    
        @ResponseBody
        @RequestMapping(value = "/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String stubAction(HttpServletRequest request,
                                 @PathVariable String group,
                                 @PathVariable String namespace, @PathVariable String action,
                                 String callback
                , String charset) {
            return stubAction(request, stub_folder + group + "/" + namespace + "/" + action
                    + stub_file_Suffix, callback, charset);
        }
    
        @ResponseBody
        @RequestMapping(value = "/{version}/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
        public String stubAction(HttpServletRequest request,
                                 @PathVariable String version,
                                 @PathVariable String group,
                                 @PathVariable String namespace, @PathVariable String action,
                                 String callback
                , String charset) {
            return stubAction(request, stub_folder + version + "/" + group + "/" + namespace + "/" + action
                    + stub_file_Suffix, callback, charset);
        }
    
        private String stub(HttpServletRequest request, String path) {
            return stub(request, path, SystemHWUtil.CURR_ENCODING);
        }
    
        /***
         * 读取文件
         *
         * @param request
         * @param path
         * @param charset
         * @return
         */
        private String stub(HttpServletRequest request, String path, String charset) {
            String content = null;
            try {
                String realPath2 = WebServletUtil.getRealPath(request, path);
                java.io.InputStream input = new FileInputStream(realPath2);
                content = FileUtils.getFullContent2(input, charset, true);
            } catch (java.io.FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return content;
        }
    
    }
    

     

     

    本文由澳门402永利com发布于编程应用,转载请注明出处:使用stub进行快速迭代开发,提取excel表数据成j

    关键词:

上一篇:没有了

下一篇:没有了