Python-以excel特定列为参考,查找缺少的文件
本模块主要实现功能:参照excel表某列的内容,查找指定文件夹中的去掉后缀的文件名称是否存在。python 读取excel的package(excel read data):xlrd
import xlrd import os from find_lack_file2 import folder_directory # excel路径输入判断 def excel_directory(path): pass_status = False # 目录输入通过的状态,初始不通过 inp_limit = 5 # 输入限制次数 warn_str = "请输入参考excel文件的完整路径(如C:/Users/Default/Pictures/test.xls),退出请按’#‘:" for inp_count in range(inp_limit): pass_status = True # 目录输入通过的状态,布尔类型 inp_path = input("文件路径输入限制{}次,第{}次\n".format(inp_limit, inp_count + 1) + warn_str) if '\\' in inp_path and '/' in inp_path: if inp_path == '#': exit() # 退出程序 print("输入的文件夹路径格式有误,路径不能同时用正斜杠‘/’和反斜杠'\\'表示\n") pass_status = False elif os.path.isdir(inp_path): # 若输入的是存在的文件夹路径 print("输入的文件路径格式有误,路径是文件夹路径\n") pass_status = False elif os.path.isfile(inp_path): parent_path = os.path.dirname(inp_path) if parent_path == path: print("excel文件不能在要检索的文件夹路径中:{}\n".format(path)) pass_status = False continue elif not os.path.exists(inp_path): # 若输入的是不存在的文件或文件夹 print("文件路径不存在") pass_status = False else: # 若是文件则要判断,文件上级路径是否存在 print("输入的文件路径存在未知") pass_status = False if pass_status: return inp_path if not pass_status: print("{}次输入excel文件完整路径有误,程序退出".format(inp_limit)) exit() # 路径输入错误,退出程序 # 打开excel文件 def open_excel(filename='example.xls'): try: excel = xlrd.open_workbook(filename) return excel except BaseException as e: print(e) # 将浮点数据转化整数数据 def convert_data(data_list): data_len = len(data_list) for i in range(data_len): data = data_list[i] if type(data).__name__ == 'float': # type(data).__name__ 对象的类的名称 if data % 1 == 0: data_list[i] = int(data) # xlrd 模块会将Excel所有数字视为浮点数,将数据转为整数 return data_list # 判断参考excel文件、excel的sheet表、列名和要检查的文件夹目录是否存在 def exist_reference(path): excel_path = excel_directory(path) # 参考excel文件的目录 excel = open_excel(excel_path) # 打开excel文件 sheet_list = excel.sheet_names() # 获取所有的sheet工作表名 sheet_name = input("excel'{}'存在工作表{},请输入参考工作表:".format(excel_path, sheet_list)) if sheet_name not in sheet_list: # 若指定工作表是不存在excel中,则退出程序 print("excel'{}'不存在工作表{},程序退出".format(excel_path, sheet_name)) exit() sheet = excel.sheet_by_name(sheet_name) # 根据sheet名字来获取excel中的sheet row_list = sheet.row_values(0) # 获取第一行的列名 ref_col_name = input("excel'{}'指定工作表'{}'存在列名{},请输入参考列名:".format(excel_path, sheet_name, row_list)) # 判断列名是否在工作表中 if ref_col_name in row_list: # 查找指定列名在第一行哪一列,即列索引 col_index = row_list.index(ref_col_name) # 指定列名在第一行的列索引 column_list = sheet.col_values(col_index) # 根据据指定列名在第一行的列索引查找目标列的数据 column_list.pop(col_index) # 根据第一行指定列名的索引,删除列名在列表中的数据 column_list = convert_data(column_list) # 将指定列存在浮点数据转为整数数值 else: print("excel'{}'的工作表{}不存在列名{},程序退出".format(excel_path, sheet_name, ref_col_name)) exit() return column_list # 返回要检查的文件夹路径,excel指定工作表指定列名的数据列表 # 去除文件后缀的文件名称 def get_name_after_suffix(path): sep_str = '.jpg' # 要分割的字符串标志 rm_suffix_list = [] # 去掉文件名称的后缀名的名称列表 file_list = os.listdir(path) # 获取目录的文件列表 for file in file_list: if sep_str in file: name = file.split(sep_str)[0] rm_suffix_list.append(name) return rm_suffix_list # 对比结果 def compare_file_column(check_list, refer_list): compare_list = [] # 对比列表 for refer_name in refer_list: if refer_name not in check_list: compare_list.append(refer_name) return compare_list if __name__ == '__main__': folder_dir = folder_directory("要检查的") # 要检查的文件夹目录 name_list = get_name_after_suffix(folder_dir) # 去除文件后缀的文件名称 res_list = exist_reference(folder_dir) # 参考excel文件、参考sheet工作表、参考列名存在 last_list = compare_file_column(name_list, res_list) # 文件名和参考列名的对比结果 print(last_list)