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进行对比的主要内容,如果未能解决你的问题,请参考以下文章

Python_Example_装饰器

Python_Example_多子类继承程序

Python_Example_ NumPy 学习/示例

Python_Example_商品结算程序

Python_Example_文件路径读取返回_文件目录选择文件_实现程序

Python_Example_常用正则&&表达式符号