Python的Listd 数据格式 V0.1

class Listd:"""Listd 数据格式 V0.1方法:基础创建数据方法head、add、delete、delete_line、view、get_column操作表格方法:to_read、to_save轻量化表头集成二维数组的listd类型结合dict和list的优点来处理数据设计角度是用于处理动态变化的业务数据在此的基础上适配一定的读取Excel表格转换还有生成Excel表格的功能动态适配环境"""def __init__(self):# 一维表头数据self.title = []# 二维listself.data = []# 一维操作层 是二维list的一维映射self.operation = []# 调用工具方法def head(self, parameter):"""创建头数据"""if isinstance(parameter, list):# 创建数据头需要去重方法,但要保证顺序unique_list = list(dict.fromkeys(parameter))# 如果不存在则需要添加# 获取长度成功后按照情况获取title里是否有符合的情况,如果没有的情况进行生成for un in unique_list:if un not in self.title:self.title.append(un)# 对应的数据需要生成一份self.data.append(["" for _ in range(self.data_length())])elif isinstance(parameter, str):if parameter not in self.title:self.title.append(parameter)# 对应的数据需要生成一份self.data.append(["" for _ in range(self.data_length())])else:raise ValueError(f"不存在这种数据类型 {type(parameter)}")self.operation_data_synchronization()def add(self):"""添加一行"""# 给二维列表的数据各自添加一个空值for i in range(len(self.title)):self.data[i].append("")self.operation_data_synchronization()def delete(self, parameter):"""删除表头信息"""# list检测if isinstance(parameter, list):# 删除存在的表头,对应删除对应的data数据,设置操作数据for one in parameter:if one in self.title:index = self.exists_string(one)del self.title[index]del self.data[index]else:print(f"无对应字段 ' {one} ' ")# str检测elif isinstance(parameter, str):if parameter in self.title:index = self.exists_string(parameter)del self.title[index]del self.data[index]else:print(f"无对应字段 ' {parameter} ' ")else:raise ValueError(f"不存在这种数据类型 {type(parameter)} {parameter}")# 进行重新获取操作self.operation_data_synchronization()def delete_line(self, line=-1):"""删除一行 默认参数删除最后一行 操作往上移动"""if isinstance(line, int):num = len(self.data)for n in range(num):del self.data[n][line]self.operation_data_synchronization()else:raise ValueError(f"数据格式异常 {type(line)} {line}")def view(self):"""视察整体数据情况"""print("-----" + " 数据如下 " + "-----")print(" ".join(str(item) for item in self.title))# 获取数据长度if self.data_length() <= 5:list_part = [list(col) for col in list(zip(*self.data))]else:list_part = [list(col) for col in list(zip(*self.data))][:3]list_part += [["**" for _ in range(len(self.data))]]list_part += [list(col) for col in list(zip(*self.data))][-1:]# 循环打印for p in list_part:print(" ".join("''" if item == "" else str(item) for item in p))print(f"[{self.data_length()} rows x {len(self.data)} columns]")def get_column(self, parameter):"""获取列数据这里的数据会按照多种方法获取"""if isinstance(parameter, int):if parameter >= len(self.data):raise ValueError(f"数组越界:{parameter} > {len(self.data)-1}")return self.data[parameter]elif isinstance(parameter, str):return self.data[self.exists_string(parameter)]elif isinstance(parameter, list):if all(isinstance(item, str) for item in parameter): # str方法columns = []for p in parameter:columns.append(self.data[self.exists_string(p)])return columnselif all(isinstance(item, int) for item in parameter): # int 方法columns = []for p in parameter:columns.append(self.data[p])return columnselse:ValueError(f"list的格式异常 {type(parameter)} {parameter}")else:raise ValueError(f"数据的格式异常 {type(parameter)} {parameter}")# 数据查询和定位方法# 内部操作方法def data_length(self):"""提取第一列数据进行检测 获取长度"""if not self.data:return 1return len(self.data[0])def exists_string(self, parameter):"""检测表头值是否存在对应值"""try:index = self.title.index(parameter)except:raise ValueError("没有找到对应表头值")return indexdef operation_data_synchronization(self):"""操作数据同步"""# 操作绑定最后一行数据self.operation = [data[-1] for data in self.data]def choose(self, line):"""选择操作行"""if type(line) is not int:raise ValueError("类型错误 " + type(line))if line >= self.data_length():print(f"数组越界:{line} < {self.data_length() - 1}")return Falseself.operation = [data[line] for data in self.data]def new_head(self, key, value):"""方括号设置值方法 调用补充当设置值方法中,找不到表头数据的时候,通过生成对应数据进行处理"""if key not in self.title:self.title.append(key)else:return False# 当添加数据的时候对data进行新增列data_length = self.data_length()# 因为新建数据会连带之前数据一起处理所以按照value来赋值self.data.append([value for _ in range(data_length)])# 将操作数据同步self.operation_data_synchronization()return Truedef dynamic_import(self, module_name):"""动态导入模块并返回模块对象"""import importlibtry:# 动态导入模块并返回return importlib.import_module(module_name)except ImportError:print(f"没有对应模块 {module_name} ")return None# 扩展表格操作 采用 openpyxldef detection_environment(self):"""检测环境是否具备对应 openpyxl 环境和调用准备"""openpyxl = self.dynamic_import("openpyxl")if openpyxl is None:raise ValueError(f"请导入对应的模块 pip install openpyxl")return openpyxldef to_read(self, file_path, line=1):"""读取文件"""openpyxl = self.detection_environment()# 检测是否有文件os = self.dynamic_import("os")if not os.path.exists(file_path):raise ValueError(f"文件不存在 {file_path}")try:wb = openpyxl.load_workbook(file_path, data_only=True) # 不读取公式ws = wb.activeexcept:raise ValueError(f"文件异常 {file_path}")headers = [cell.value for cell in ws[line] if cell.value is not None]# 直接按列读取数据(跳过空列)data_columns = []for col in ws.iter_cols(values_only=True):# 过滤全为空值的列if not all(cell is None for cell in col):data_columns.append(list(col))wb.close()# 赋值self.title = headersself.data = data_columnsself.operation_data_synchronization()def to_save(self, file_path):"""保存文件"""openpyxl = self.detection_environment()wb = openpyxl.Workbook()ws = wb.active# 写入表头for col, header in enumerate(self.title, 1): # 从列号1开始ws.cell(row=1, column=col, value=header)# 写入数据for col, record in enumerate(self.data, 1): # 从列号1开始for row, value in enumerate(record, 2): # 从行号2开始ws.cell(row=row, column=col, value=value)# 保存文件wb.save(file_path)pass# 自带调用类方法def __len__(self):"""适配len调用方法"""return len(self.title)def __str__(self):"""指定输出 数据头和当前操作层"""return ("标题 " + str(self.title) + "\n" +"操作 " + str(self.operation))def __getitem__(self, key):"""方括号方法strintlist [str]list [int]"""if isinstance(key, str):# 根据值找到对应标题 如果标题没有返回错误return self.operation[self.exists_string(key)]elif isinstance(key, int):return self.operation[key]elif isinstance(key, list):if all(isinstance(item, str) for item in key): # str方法return [self.operation[self.exists_string(k)] for k in key]elif all(isinstance(item, int) for item in key): # int 方法return [self.operation[k] for k in key]else:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")def __setitem__(self, key, value):"""方括号设置值方法strintlist intlist str"""# 设置值中如果出现找不到的值应该是创建且赋值if isinstance(key, str):if self.new_head(key, value):return# 设置二维表再重获操作数据self.data[self.exists_string(key)][-1] = valueelif isinstance(key, int):if value >= len(self.data):raise ValueError(f"数组越界:{len(self.data) - 1} < {value}")self.data[key][-1] = valueelif isinstance(key, list):# value数据要么1个,要么是符合长度的if isinstance(value, str) or isinstance(value, int):passelif isinstance(value, list):if len(value) == len(key):passelse:raise ValueError(f"数据赋值长度不一 value {len(value)} key {len(key)}")else:raise ValueError(f"数据赋值类型异常 {type(value)} {value}")if all(isinstance(item, str) for item in key): # str方法if isinstance(value, list):n = 0for k in key:self.data[self.exists_string(k)][-1] = value[n]n+=1else:for k in key:self.data[self.exists_string(k)][-1] = valueelif all(isinstance(item, int) for item in key): # int 方法if isinstance(value, list):n = 0for k in key:self.data[k][-1] = value[n]n+=1else:for k in key:self.data[k][-1] = valueelse:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")# 将操作数据同步self.operation_data_synchronization()def __delitem__(self, key):"""del 删除值法strintlist [str]list [int]"""if isinstance(key, str):# 设置二维表再重获操作数据self.data[self.exists_string(key)][-1] = ""elif isinstance(key, int):self.data[key][-1] = ""elif isinstance(key, list):if all(isinstance(item, str) for item in key): # str方法for k in key:self.data[self.exists_string(k)][-1] = ""elif all(isinstance(item, int) for item in key): # int 方法for k in key:self.data[k][-1] = ""else:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")# 将操作数据同步self.operation_data_synchronization()d = Listd()
d.head(['名称', '状态', '操作'])
d[[0,1,2]] = [1,2,3]
print(len(d))
print(d)
d.view()
d.to_save("file.xlsx")
class Listd:"""Listd 数据格式 V0.1方法:基础创建数据方法head、add、delete、delete_line、view、get_column操作表格方法:to_read、to_save轻量化表头集成二维数组的listd类型结合dict和list的优点来处理数据设计角度是用于处理动态变化的业务数据在此的基础上适配一定的读取Excel表格转换还有生成Excel表格的功能动态适配环境"""def __init__(self):# 一维表头数据self.title = []# 二维listself.data = []# 一维操作层 是二维list的一维映射self.operation = []# 调用工具方法def head(self, parameter):"""创建头数据"""if isinstance(parameter, list):# 创建数据头需要去重方法,但要保证顺序unique_list = list(dict.fromkeys(parameter))# 如果不存在则需要添加# 获取长度成功后按照情况获取title里是否有符合的情况,如果没有的情况进行生成for un in unique_list:if un not in self.title:self.title.append(un)# 对应的数据需要生成一份self.data.append(["" for _ in range(self.data_length())])elif isinstance(parameter, str):if parameter not in self.title:self.title.append(parameter)# 对应的数据需要生成一份self.data.append(["" for _ in range(self.data_length())])else:raise ValueError(f"不存在这种数据类型 {type(parameter)}")self.operation_data_synchronization()def add(self):"""添加一行"""# 给二维列表的数据各自添加一个空值for i in range(len(self.title)):self.data[i].append("")self.operation_data_synchronization()def delete(self, parameter):"""删除表头信息"""# list检测if isinstance(parameter, list):# 删除存在的表头,对应删除对应的data数据,设置操作数据for one in parameter:if one in self.title:index = self.exists_string(one)del self.title[index]del self.data[index]else:print(f"无对应字段 ' {one} ' ")# str检测elif isinstance(parameter, str):if parameter in self.title:index = self.exists_string(parameter)del self.title[index]del self.data[index]else:print(f"无对应字段 ' {parameter} ' ")else:raise ValueError(f"不存在这种数据类型 {type(parameter)} {parameter}")# 进行重新获取操作self.operation_data_synchronization()def delete_line(self, line=-1):"""删除一行 默认参数删除最后一行 操作往上移动"""if isinstance(line, int):num = len(self.data)for n in range(num):del self.data[n][line]self.operation_data_synchronization()else:raise ValueError(f"数据格式异常 {type(line)} {line}")def view(self):"""视察整体数据情况"""print("-----" + " 数据如下 " + "-----")print(" ".join(str(item) for item in self.title))# 获取数据长度if self.data_length() <= 5:list_part = [list(col) for col in list(zip(*self.data))]else:list_part = [list(col) for col in list(zip(*self.data))][:3]list_part += [["**" for _ in range(len(self.data))]]list_part += [list(col) for col in list(zip(*self.data))][-1:]# 循环打印for p in list_part:print(" ".join("''" if item == "" else str(item) for item in p))print(f"[{self.data_length()} rows x {len(self.data)} columns]")def get_column(self, parameter):"""获取列数据这里的数据会按照多种方法获取"""if isinstance(parameter, int):if parameter >= len(self.data):raise ValueError(f"数组越界:{parameter} > {len(self.data)-1}")return self.data[parameter]elif isinstance(parameter, str):return self.data[self.exists_string(parameter)]elif isinstance(parameter, list):if all(isinstance(item, str) for item in parameter): # str方法columns = []for p in parameter:columns.append(self.data[self.exists_string(p)])return columnselif all(isinstance(item, int) for item in parameter): # int 方法columns = []for p in parameter:columns.append(self.data[p])return columnselse:ValueError(f"list的格式异常 {type(parameter)} {parameter}")else:raise ValueError(f"数据的格式异常 {type(parameter)} {parameter}")# 数据查询和定位方法# 内部操作方法def data_length(self):"""提取第一列数据进行检测 获取长度"""if not self.data:return 1return len(self.data[0])def exists_string(self, parameter):"""检测表头值是否存在对应值"""try:index = self.title.index(parameter)except:raise ValueError("没有找到对应表头值")return indexdef operation_data_synchronization(self):"""操作数据同步"""# 操作绑定最后一行数据self.operation = [data[-1] for data in self.data]def choose(self, line):"""选择操作行"""if type(line) is not int:raise ValueError("类型错误 " + type(line))if line >= self.data_length():print(f"数组越界:{line} < {self.data_length() - 1}")return Falseself.operation = [data[line] for data in self.data]def new_head(self, key, value):"""方括号设置值方法 调用补充当设置值方法中,找不到表头数据的时候,通过生成对应数据进行处理"""if key not in self.title:self.title.append(key)else:return False# 当添加数据的时候对data进行新增列data_length = self.data_length()# 因为新建数据会连带之前数据一起处理所以按照value来赋值self.data.append([value for _ in range(data_length)])# 将操作数据同步self.operation_data_synchronization()return Truedef dynamic_import(self, module_name):"""动态导入模块并返回模块对象"""import importlibtry:# 动态导入模块并返回return importlib.import_module(module_name)except ImportError:print(f"没有对应模块 {module_name} ")return None# 扩展表格操作 采用 openpyxldef detection_environment(self):"""检测环境是否具备对应 openpyxl 环境和调用准备"""openpyxl = self.dynamic_import("openpyxl")if openpyxl is None:raise ValueError(f"请导入对应的模块 pip install openpyxl")return openpyxldef to_read(self, file_path, line=1):"""读取文件"""openpyxl = self.detection_environment()# 检测是否有文件os = self.dynamic_import("os")if not os.path.exists(file_path):raise ValueError(f"文件不存在 {file_path}")try:wb = openpyxl.load_workbook(file_path, data_only=True) # 不读取公式ws = wb.activeexcept:raise ValueError(f"文件异常 {file_path}")headers = [cell.value for cell in ws[line] if cell.value is not None]# 直接按列读取数据(跳过空列)data_columns = []for col in ws.iter_cols(values_only=True):# 过滤全为空值的列if not all(cell is None for cell in col):data_columns.append(list(col))wb.close()# 赋值self.title = headersself.data = data_columnsself.operation_data_synchronization()def to_save(self, file_path):"""保存文件"""openpyxl = self.detection_environment()wb = openpyxl.Workbook()ws = wb.active# 写入表头for col, header in enumerate(self.title, 1): # 从列号1开始ws.cell(row=1, column=col, value=header)# 写入数据for col, record in enumerate(self.data, 1): # 从列号1开始for row, value in enumerate(record, 2): # 从行号2开始ws.cell(row=row, column=col, value=value)# 保存文件wb.save(file_path)pass# 自带调用类方法def __len__(self):"""适配len调用方法"""return len(self.title)def __str__(self):"""指定输出 数据头和当前操作层"""return ("标题 " + str(self.title) + "\n" +"操作 " + str(self.operation))def __getitem__(self, key):"""方括号方法strintlist [str]list [int]"""if isinstance(key, str):# 根据值找到对应标题 如果标题没有返回错误return self.operation[self.exists_string(key)]elif isinstance(key, int):return self.operation[key]elif isinstance(key, list):if all(isinstance(item, str) for item in key): # str方法return [self.operation[self.exists_string(k)] for k in key]elif all(isinstance(item, int) for item in key): # int 方法return [self.operation[k] for k in key]else:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")def __setitem__(self, key, value):"""方括号设置值方法strintlist intlist str"""# 设置值中如果出现找不到的值应该是创建且赋值if isinstance(key, str):if self.new_head(key, value):return# 设置二维表再重获操作数据self.data[self.exists_string(key)][-1] = valueelif isinstance(key, int):if value >= len(self.data):raise ValueError(f"数组越界:{len(self.data) - 1} < {value}")self.data[key][-1] = valueelif isinstance(key, list):# value数据要么1个,要么是符合长度的if isinstance(value, str) or isinstance(value, int):passelif isinstance(value, list):if len(value) == len(key):passelse:raise ValueError(f"数据赋值长度不一 value {len(value)} key {len(key)}")else:raise ValueError(f"数据赋值类型异常 {type(value)} {value}")if all(isinstance(item, str) for item in key): # str方法if isinstance(value, list):n = 0for k in key:self.data[self.exists_string(k)][-1] = value[n]n+=1else:for k in key:self.data[self.exists_string(k)][-1] = valueelif all(isinstance(item, int) for item in key): # int 方法if isinstance(value, list):n = 0for k in key:self.data[k][-1] = value[n]n+=1else:for k in key:self.data[k][-1] = valueelse:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")# 将操作数据同步self.operation_data_synchronization()def __delitem__(self, key):"""del 删除值法strintlist [str]list [int]"""if isinstance(key, str):# 设置二维表再重获操作数据self.data[self.exists_string(key)][-1] = ""elif isinstance(key, int):self.data[key][-1] = ""elif isinstance(key, list):if all(isinstance(item, str) for item in key): # str方法for k in key:self.data[self.exists_string(k)][-1] = ""elif all(isinstance(item, int) for item in key): # int 方法for k in key:self.data[k][-1] = ""else:ValueError(f"list的格式异常 {type(key)} {key}")else:raise ValueError(f"不存在其他赋值的格式 {type(key)} {key}")# 将操作数据同步self.operation_data_synchronization()d = Listd()
d.head(['名称', '状态', '操作'])
d[[0,1,2]] = [1,2,3]
print(len(d))
print(d)
d.view()
d.to_save("file.xlsx")