Python_Example_多个Excel进行对比
Posted caochucheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python_Example_多个Excel进行对比相关的知识,希望对你有一定的参考价值。
Author: 楚格
2018-11-14 21:11:04
IDE: Pycharm2018.02 Python 3.7
KeyWord : 面向对象实例
Explain:
1.path读取路径
2.API获取数据以及处理
3.思路
3.1先获取路径,包括动态获取当前路径,可视化选择文件,简单防止误操作判断。
3.2先获取Excel中数据,固定行列位置,读取的数据存储在列表中,列表中的元素以字典方式存储,便于查找。
3.3 读取standard和actual数据,以actual的一列中的某个数据与standard的一列数据进行对比,判断。
3.4若对比结束,返回信息。包括屏幕打印和日志保存的统计信息。
3.5正则表达,判断首字母是新增的
3.6此部分程序可以作为模块接口示例程序。
-----------------------------------------------------------------------------
程序结构图
--------------------------------------------------------------------------------
path
-------
1 # coding=utf-8 2 #--------------------------------- 3 \'\'\' 4 # Author : chu ge 5 # Function: 提取文件路径 6 # 7 \'\'\' 8 #--------------------------------- 9 __all__ = [\'Class_File_Read\'] 10 11 import os 12 13 \'\'\' 14 # ============================================================================ 15 # Class : 类 file path 16 # Explain : 输入参数 文件的序号 17 # : 输出参数 global_var_file_name_file <路径> 18 # ============================================================================ 19 \'\'\' 20 class Class_File_Read(object): 21 def __init__(self): 22 # print(\'Class file read excel\') 23 self.Methoons_File_Directory() 24 25 def Methods_File_Operation_Standard(self): 26 print(\'\\nstandard input:0 \') 27 STANDARD = "0" 28 File_Path = self.Methods_Select_File(STANDARD) 29 print("Methods_File_Operation_Standard \\n") 30 return File_Path 31 32 def Methods_File_Operation_Actual(self): 33 number = input("Actual Input :") 34 # number = "1" # 临时 35 File_Path = self.Methods_Select_File(number) 36 print("Methods_File_Operation_Actual \\n") 37 return File_Path 38 39 def Methoons_File_Directory(self): 40 # 初始化列表 存放文件 41 local_var_num = [] 42 local_var_file_name = [] 43 # 获取当前文件路径 调试使用 44 # local_var_cwd = os.getcwd() 45 # print(\'当前文件夹的路径 :\\n->>> < %s >\' % local_var_cwd ) 46 # [dir_name, file_name] = os.path.split(local_var_cwd) 47 # print(\'分离files & path:< %s > < %s >\'%(dir_name,file_name)) 48 # 固定文件夹目录 49 try: 50 local_var_cwd = \'D:\\Auto_Testing_Pycharm\\Test_Instance\\Test_User_Excel\\excel\' 51 local_var_list_name = os.listdir(local_var_cwd) # # print(\'当前文件夹下的所有文件和文件夹:\') 52 except Exception: 53 print("捕获异常:\\n目录:<%s>\\n位置:<%s>"%(os.getcwd(),"固定文件夹目录")) 54 55 56 # 遍历文件夹 编号 + 文件名 57 for temp_var_num in range(len(local_var_list_name)): 58 # print(\'num:%s name:< %s >\'% (temp_var_num,local_var_list_name[temp_var_num])) # display All 59 [new_file_name, file_name_end] = os.path.splitext(local_var_list_name[temp_var_num]) # file name handle 60 # print(\'分离文件名与后缀:< %s > < %s > \'%(new_file_name,file_name_end)) # display result 61 62 # 过滤其他文件 保留Excel文件 以供选择 63 if file_name_end == \'.xlsx\': 64 local_var_num.append(temp_var_num) # 存储文件编号 65 local_var_file_name.append(local_var_list_name[temp_var_num]) # 存储文件名称 66 # print(\'Display select files : \', local_var_num, local_var_file_name) # 显示二个列表 67 # ------------------------------------------------------------------------------------------ 68 # 显示留存的文件 二个列表映射成字典 保留列表方便调试使用 技巧 *** 69 local_var_storage = dict(zip(local_var_num, local_var_file_name)) 70 71 # 提示 遍历字典元素 显示内容 local_var_storage.items() 无序 72 # 可以这个替换 : print(\'Your selecr pprotocol : < %s > \'% local_var_storage.keys()) 73 # print(\'Protocols that can be executed : \') 74 for temp_var_num in local_var_storage: 75 print("", temp_var_num, local_var_storage[temp_var_num]) 76 # ----------------------------------------------------------------------------- 77 78 def Methods_Select_File(self,number): 79 global global_var_file_name_file 80 local_var_select_number = number 81 82 # 固定文件夹目录 83 local_var_cwd = \'D:\\Auto_Testing_Pycharm\\Test_Instance\\Test_User_Excel\\excel\' 84 local_var_list_name = os.listdir(local_var_cwd) # # print(\'当前文件夹下的所有文件和文件夹:\') 85 local_var_num = [] 86 local_var_file_name = [] 87 88 for temp_var_num in range(len(local_var_list_name)): 89 [new_file_name, file_name_end] = os.path.splitext(local_var_list_name[temp_var_num]) # file name handle 90 if file_name_end == \'.xlsx\': 91 local_var_num.append(temp_var_num) # 存储文件编号 92 local_var_file_name.append(local_var_list_name[temp_var_num]) # 存储文件名称 93 94 protocol_num = True 95 96 while protocol_num: 97 if local_var_select_number < str(len(local_var_num)): 98 print(\'Your select protocol : < %s > \'% local_var_file_name[int(local_var_select_number)]) 99 # 拼接路径 100 temp_var_path_string = local_var_cwd +\'\\\\\'+ local_var_file_name[int(local_var_select_number)] 101 # print(\'temp_var_path_string: %s \'% temp_var_path_string) 102 protocol_num = False 103 global_var_file_name_file = temp_var_path_string 104 105 else: 106 print(\'请选择可以执行的协议!\') 107 protocol_num = True 108 109 return global_var_file_name_file # 出口 110 111 # 112 113 # ============================================================================ 114 115 \'\'\' 116 # ============================================================================ 117 # 测试专用 118 # ============================================================================ 119 \'\'\' 120 if __name__ == "__main__": 121 print(\'测试开始\') 122 \'\'\' 123 # 读取当前文件下,Excel文件 124 \'\'\' 125 aa = Class_File_Read() 126 # asd = aa.Methods_File_Operation_Standard() 127 # aa.Methods_File_Operation_Actual() 128 asd = aa.Methods_Select_File("1") 129 print(\'Path: <%s> \'%(asd)) 130 print(\'测试完成\')
-------
-----------------------------------------------------------
API
-------
# coding=utf-8 # --------------------------------- \'\'\' # Author : chu ge # Function: # \'\'\' # --------------------------------- \'\'\' # ------------------------------------------ # 导入模块 # 1.系统库 # 2.第三方库 # 3.相关定义库 # ------------------------------------------ \'\'\' # 1.系统库 import sys import os import re # 2.第三方库 # 读取 Excel 模块 import xlrd import xlwt import logging \'\'\' # ------------------------------------------ # 导入:同级不同文件夹 # 先文件夹__init__注释,其次引用name.py # 最后 使用具体 类class 或者 函数function 名称 # ------------------------------------------ \'\'\' import Test_Log \'\'\' # ------------------------------------------ # 导入:同级同文件夹 # 先引用name.py # 后 使用具体 类class 或者 函数function 名称 # ------------------------------------------ \'\'\' import Testing_Read_Path # \'\'\' # ============================================================================ # Class : 类 # Explain : 输入参数 # : 输出参数 # ============================================================================ \'\'\' class Class_Module_Read(object): def __init__(self): print() def Methods_Excel_Data(self, file_path, colnameindex=0, by_name=u\'Sheet1\'): # 修改自己路径 # print(\'Function_Excel_Table_Byname\') # --------------------------------------------------------------------------------------- self.File = file_path # 路径名称变换 # 路径 # print("路径",self.File) # --------------------------------------------------------------------------------------- local_list_line = [] # Methods_Excel_Data try: # -------------------------------------------------------------------------------------- local_var_temp_data = xlrd.open_workbook(self.File) # 打开电子文档 目的:响应删除函数 # # 这里可以拓展,使用一个Excel 利用不同表格,可以减少外部表格的数量,与上述打开表格方式 是不同的 local_var_temp_table = local_var_temp_data.sheet_by_name(by_name) # 获得表格 Excel中不同表格 # # Contains the data for one worksheet local_var_total_rows = local_var_temp_table.nrows # 属性 拿到总共行数 # print(\'total_rows: < %d >\' % local_var_total_rows) # display # # Returns a slice of the values of the cells in the given line local_var_column_names = local_var_temp_table.row_values(colnameindex, 0, 6) # 某一列数据 [\'\', \'\', \'\', \'\'] 默认从0行开始 # print(\'line num: < %s > names: < % s >\'% (len(local_var_column_names),local_var_column_names)) for temp_num in range(1, local_var_total_rows): # 也就是从Excel第二行开始,第一行表头不算 local_var_row = local_var_temp_table.row_values(temp_num) # 返回单元格中切片 # print(\'rows_num: < %s > line_num: < %s > each_element\' % (temp_num ,len(local_var_row)),local_var_row ) # 每row 就是列表 # 每行分片成列表, 列表转变成字典, 字典转变成列表 local_dictionary_app = dict(zip(local_var_column_names, local_var_row)) # 列表变字典 # print(\'local_dictionary_app: \',local_dictionary_app) local_list_line.append(local_dictionary_app) # 字典转变成列表 # # 内部的字典变成了元素 # print(\'local_list_line: \',local_list_line) #打印列表元素 return local_list_line except Exception: print("捕获异常:\\n位置:<%s>\\n目录:<%s>" % ("Methods_Excel_Data", os.getcwd())) def Methods_Excel_Data_Display(self, file_path): local_list_line = self.Methods_Excel_Data(file_path) # 遍历列表中的元素 显示成表格模式 for line in local_list_line: print(\'行号编码:< %s > %s\' % (local_list_line.index(line), line)) # pprint.pprint(line) # 规则打印数据 # 返回列表 并且列表的元素是字典 # \'\'\' # ============================================================================ # Class : 类 # Explain : 输入参数 表格数据 # : 输出参数 分表格 # ============================================================================ \'\'\' class Class_Module_Tlabe(object): def __init__(self): File_Path = Testing_Read_Path.Class_File_Read() # 路径对象 path self.local_var_path_standard = File_Path.Methods_File_Operation_Standard() self.local_var_path_actual = File_Path.Methods_File_Operation_Actual() self.Log_Display = Test_Log.Test_Save_log.Class_Log_Display() self.Log_Display.Methods_BasicConfig() def Methods_Table_Standard(self): # Methods_Table_Standard try: File_Read = Class_Module_Read() # Excel data 对象 Table_Standard = File_Read.Methods_Excel_Data(self.local_var_path_standard) return Table_Standard except Exception: print("捕获异常:\\n位置:<%s>\\n目录:<%s>" % ("Methods_Table_Standard", os.getcwd())) def Methods_Table_Actual(self): # Methods_Table_Actual try: File_Read = Class_Module_Read() # Excel data 对象 Table_Actual = File_Read.Methods_Excel_Data(self.local_var_path_actual) return Table_Actual except Exception: print("捕获异常:\\n位置:<%s>\\n目录:<%s>" % ("Methods_Table_Actual", os.getcwd())) # # 搜索actual 中循环搜索的词条,逐个与全部的标准库进行对比 def Methods_Search_Actual_To_Standard(self): Table_Actual = self.Methods_Table_Actual() local_error_line_list = [] Feature = self.Methods_Feature_Select() # Actual_To_Standard try: local_var_order_count = 0 # 初始化计数 print("Total Actual Line : < %d >" % len(Table_Actual)) for Var_A_Element in Table_Actual: local_var_order_count += 1 # 这里是对比的源头 # 添加规则正则表达,首字母 try: Is_Capital =self.Methods_Capital_Word(Var_A_Element[1]) if Is_Capital == True: A1 = self.Methods_Search_Standard(1, Var_A_Element[1]) # 第1列 备注 第0列开始 else: A1 = None except Exception: print("123") A2 = self.Methods_Search_Standard(2, Var_A_Element[2]) # 第2列 # 功能选择处 if Feature == "1": A3 = "1" else: A3 = self.Methods_Search_Standard(3, Var_A_Element[3]) # 第3列 print(\'*\' * 20) print(\'line Number : <%d>\' % (local_var_order_count + 1)) logging.info(\'\\nline Number : [%d]\\n%s\' % ((local_var_order_count + 1),"one sql end")) if ((A1 == "1") and (A2 == "1") and(A3 == "1")) != 0: print(\'本词条测试结束\') print("--" * 20) else: print(\'词条有错误!!! 请查找原因 !!!\') print("--" * 20) local_error_line_list.append(local_var_order_count) # test message total print("Test Message Total") for var_line in local_error_line_list: print("Error line: %s" % (var_line + 1)) # 对应Excel logging.info("Error line: %s" % (var_line + 1)) print("Total Num : <%s>" % len(local_error_line_list)) logging.info("Total Num : <%s>" % len(local_error_line_list)) except Exception: print("捕获异常:\\n位置:<%s>\\n目录:<%s>" % ("Actual_To_Standard", os.getcwd())) def Methods_Search_Standard(self, line, entry): Table_Standard = self.Methods_Table_Standard() self.loacl_var_line = line self.local_var_entry = entry Local_var_count = 1 # Search_Actual_To_Standard try: # 单个思路:获取到对值进行匹配,此值作为对比的标点,标准库作为标靶 # 搜索匹配功能,遍历每行,对应元素进行匹配,这是关键 # 最后返回提示量 for Var_A_Element in Table_Standard: # 有词条且词条不为空 if (self.local_var_entry == Var_A_Element[self.loacl_var_line]) != 0: Local_Test_Flag = "1" return Local_Test_Flag else: Local_Test_Flag = "0" Local_var_count += 1 # 调试时,打开打印 print("Error name:<%s>" % self.local_var_entry) logging.info("\\nError column: <%d>\\n词条名称 : <%s>" %(self.loacl_var_line,self.local_var_entry) ) except Exception: print("捕获异常:\\n位置:<%s>\\n目录:<%s>" % ("Search_Actual_To_Standard", os.getcwd())) # 功能选择函数 def Methods_Feature_Select(self): # 1.feature 1和2列对比(默认) # 2.feature 1、2和3列对比 print("Feature Select:\\n[%s]\\n[%s]"%("1.feature 1和2列对比(默认)","2.feature 1、2和3列对比")) # Feature_Name = input(">>: ") Feature_Name = "1" #调试固定 if Feature_Name >"3" : Feature_Name = "1" return Feature_Name #首字母大写特地检查 def Methods_Capital_Word(self,column1): result_value = re.match(r"[A-Z]",column1) if result_value: result = True # result = result2.istitle() else: result = False # print("首字母大写特地检查:",result) return result # \'\'\' # ============================================================================ # Function: Function_Excel_Data 函数 # Explain : 输入参数 对象 列表的字典 # : 输出参数 被调用 # ============================================================================ \'\'\' def Function_Excel_Data(): # Function_Excel_Data try: File_Path = Testing_Read_Path.Class_File_Read() # 路径对象 path local_var_path_standard = File_Path.Methods_File_Operation_Standard() local_var_path_actual = File_Path.Methods_File_Operation_Actual() # File_Read = Class_Module_Read() # Excel data 对象 # Table_Standard = File_Read.Methods_Excel_Data(local_var_path_standard) # Table_Actual = File_Read.Methods_Excel_Data(local_var_path_actual) File_Read.Methods_Excel_Data_Display(local_var_path_standard) File_Read.Methods_Excel_Data_Display(local_var_path_actual) except Exception: print("捕获异常:\\n目录:<%s>\\n位置:<%s>" % ("Function_Excel_Data", os.getcwd())) # # ============================================================================ \'\'\' # ============================================================================ # 测试专用 # ============================================================================ \'\'\' if __name__ == "__main__": print(\'测试开始\') # ============================ Table_data = Class_Module_Tlabe() Table_data.Methods_Search_Actual_To_Standard() print(\'测试完成\')
--
------------------------------------------------
结束
以上是关于Python_Example_多个Excel进行对比的主要内容,如果未能解决你的问题,请参考以下文章