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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章