本模块主要实现功能:参照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)