文章主要是创建:

log : 日志文件

excel :文档的读写

ini 及 yaml :文件的读取

一:创建log日志文件

主要是对logging框架进行二次封装并输出自己需要的日志格式

1. 首先我们需要判断日志存储文件夹是否存在,不存在就进行创建

# log_path是存放日志的路径
cur_path = os.path.dirname(os.path.realpath(__file__))
log_path = os.path.join(cur_path, 'logs') # 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(log_path): os.mkdir(log_path)

2. 确定日志的输出格式,可以自行进行调整

        # 文件的命名
self.logname = os.path.join(log_path, classification + '-%s.log' % time.strftime('%Y_%m_%d')) # 定义执行者的名字
self.logger = logging.getLogger(executor) # 设置输入语句的等级
self.logger.setLevel(logging.DEBUG) # 日志输出格式
self.formatter = logging.Formatter('[%(asctime)s] - %(name)s] - %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') # 定义执行函数的名字供外部进行调用和修改
self.fun_name = "Undefined_Function"

3.  日志输出到文件中

 # fh = logging.FileHandler(self.logname, 'a')  # 追加模式  这个是python2的
fh = logging.FileHandler(self.logname, 'a', encoding='utf-8') # 这个是python3的 # 大于等于该错误等级的才被写入到日志文件
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)

4. 日志输出控制台

        ch = logging.StreamHandler()

        # 大于等于该错误等级的才被输出到控制台
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)

5. 以及日志输出的等级和设置当前使用日志的函数名

    def debug(self, message):
self.__console('debug', "%s---%s" % (self.function, message)) def info(self, message):
self.__console('info', "%s---%s" % (self.function, message)) def warning(self, message):
self.__console('warning', "%s---%s" % (self.function, message)) def error(self, message):
self.__console('error', "%s---%s" % (self.function, message)) def critical(self, message):
self.__console('critical', "%s---%s" % (self.function, message)) def set_function_name(self, function_name):
self.function = function_name def get_function_name(self):
return self.function def log_ppriny(self, message):
pprint.pprint(message) fun_name = property(get_function_name, set_function_name, doc="log获取的时候出错

6. 编写到同一个函数中,统一调用。

# 写入文件的定义
fh = self.log_write_file() # 输出到控制的定义
ch = self.log_output_console() level = getattr(self.logger, level)
level(message) # 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh) # 关闭打开的文件
fh.close()

7. 整体代码

import logging
import os
import pprint
import time # log_path是存放日志的路径
cur_path = os.path.dirname(os.path.realpath(__file__))
log_path = os.path.join(cur_path, 'logs') # 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(log_path): os.mkdir(log_path) class Logger(object): def __init__(self, executor: str = "Root", classification: str = 'Journal') -> None:
"""
日志函数在实例化的声明内部参数
:param executor: 日志使用者
:param classification: 日志文件名字前缀
"""
# 文件的命名
self.logname = os.path.join(log_path, classification + '-%s.log' % time.strftime('%Y_%m_%d')) # 定义执行者的名字
self.logger = logging.getLogger(executor) # 设置输入语句的等级
self.logger.setLevel(logging.DEBUG) # 日志输出格式
# self.formatter = logging.Formatter('[%(asctime)s] - %(name)s - %(filename)s] - %(levelname)s: %(message)s')
self.formatter = logging.Formatter('[%(asctime)s] - %(name)s] - %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') # 定义执行函数的名字供外部进行调用和修改
self.fun_name = "Undefined_Function" def log_write_file(self) -> logging.FileHandler:
"""
创建一个FileHandler,将日志写到本地文件中
:return: logging.FileHandler
"""
# fh = logging.FileHandler(self.logname, 'a') # 追加模式 这个是python2的
fh = logging.FileHandler(self.logname, 'a', encoding='utf-8') # 这个是python3的 # 大于等于该错误等级的才被写入到日志文件
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
return fh def log_output_console(self) -> logging.StreamHandler:
"""
创建一个StreamHandler,用于输出到控制台
:return: logging.StreamHandler
"""
ch = logging.StreamHandler() # 大于等于该错误等级的才被输出到控制台
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)
return ch def __console(self, level, message):
# 写入文件的定义
fh = self.log_write_file() # 输出到控制的定义
ch = self.log_output_console() level = getattr(self.logger, level)
level(message) # 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh) # 关闭打开的文件
fh.close() def debug(self, message):
self.__console('debug', "%s---%s" % (self.function, message)) def info(self, message):
self.__console('info', "%s---%s" % (self.function, message)) def warning(self, message):
self.__console('warning', "%s---%s" % (self.function, message)) def error(self, message):
self.__console('error', "%s---%s" % (self.function, message)) def critical(self, message):
self.__console('critical', "%s---%s" % (self.function, message)) def set_function_name(self, function_name):
self.function = function_name def get_function_name(self):
return self.function def log_ppriny(self, message):
pprint.pprint(message) fun_name = property(get_function_name, set_function_name, doc="log获取的时候出错了")

二: 读取excel表格内容

主要使用pandas 来读取数据信息,并将某个列下的内容设置为当前数据的序号。

后期用例运行时,通过读取序号来读取数据并进行输出。

1. 整体代码有点多,可自行删除一些。绝大部分的代码都没有使用到

import os

import pandas as pd

from openpyxl import Workbook, load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows """
这个class负责读取数据:从excel中读取数据到电脑
""" class READEXCEL: def startReadExcel(self, FILEPATH, SHEETNAME=1):
"""
FILEPATH :需要文件的位置
SHEETNAME :读取工作薄的页面或者工作薄名
"""
# 判断文件是否存在
if os.path.exists(FILEPATH):
self.excel = FILEPATH # 判断是否为空
self.readexccel_Data(SHEETNAME)
else:
raise FileNotFoundError('文件不存在!') def readexccel_Data(self, sheet):
"""
此处不严谨:如果输入的字符串都为数字那么就会出错
:param sheet:
:return:
""" # 创建需要操作的文档
self.workbook = load_workbook(filename=self.excel) # 打开文档 # 判断是根据数字还是文字进行读取sheet,如果是数字的话必须小于现有的长度
if type(sheet) in [int] and sheet <= len(self.workbook.sheetnames):
# elf.workbook.sheetnames 打印工作薄名称
self.sheetbook = self.workbook[self.workbook.sheetnames[sheet - 1]] # 如果是文字
elif type(sheet) in [str]:
self.sheetbook = self.workbook[sheet] # 长度过长时提示
elif sheet > len(self.workbook.sheetnames):
print("sheet索要的位置大于现有的长度") # 最后输出
else:
print("你输入啥咯.") def get_sheet_value(self, _value):
"""
返回读取到单元格的内容,并已cell形式返回
:param _value: 需要读取的单元格
:return:
"""
# 先判断需要寻找的cell位置。如果为空或者其他类型的就提示
if type(_value) in [int, str]:
content = self.sheetbook[_value]
# 打印指定的内容:ws['A4']返回的是一个cell,通过value来获取值
# content = self.sheetbook[_value].value
return content
else:
print('1级错误') def coordinates_sheet_row_value(self, min_row=1, max_row=None, max_col=None):
"""
指定行读取整行的数据数据信息,数据已经通过value转换了
:param min_row: 最小的行
:param max_row: 最大的行
:param max_col: 最大的列
:return:
"""
content = self.sheetbook.iter_rows(min_row=min_row, max_row=max_row, max_col=max_col)
row_col_data = [] # 存储除了标题以外的内容
# title_data = [] # 只存储标题内容
_data = True # 用来控制第一行打印的数据为用例标题
for row in content: # 工作薄的全部内容
if _data:
title_data = list(map(lambda single: single.value, row)) # 添加标题
_data = False
else:
# 存储除了标题以外的内容
row_col_data.append(list(map(lambda single: single.value, row)))
return row_col_data, title_data def die_angegebene_keys(self, row_col_data, title_data, keys="函数"):
"""
# 根据指定的keys值执行读取
:param row_col_data: 从case中单独分离出的数据信息
:param title_data: 从case中单独获取的title信息
:param keys: 根据title_data中某个key值进行读取数据
:return:
"""
columnLabel = [] # 获取指定key的内容用于做序列名
for title in range(len(title_data)):
if title_data[title] == keys:
for rowColExcel in row_col_data:
columnLabel.append(rowColExcel[title])
break
return columnLabel def coordinates_sheet_cols_value(self, min_row=1, max_row=None, max_col=None):
'''
指定列来读取整列的数据,数据已经通过value转换了
:param min_row: 最小的行
:param max_row: 最大的行
:param max_col: 最大的列
:return:
'''
content = self.sheetbook.iter_cols(min_row=min_row, max_row=max_row, max_col=max_col)
return content def coordinates_sheet_row(self, min_row=1, max_row=None, max_col=None):
"""
指定行读取整行的数据数据信息,数据类型为cell
:param min_row: 最小的行
:param max_row: 最大的行
:param max_col: 最大的列
:return:
"""
content = self.sheetbook.iter_rows(min_row=min_row, max_row=max_row, max_col=max_col)
return content def coordinates_sheet_cols(self, min_row=1, max_row=None, max_col=None):
'''
指定列来读取整列的数据,数据类型为cell
:param min_row: 最小的行
:param max_row: 最大的行
:param max_col: 最大的列
:return:
'''
content = self.sheetbook.iter_cols(min_row=min_row, max_row=max_row, max_col=max_col)
return content def get_sheet_title(self):
# 工作薄的名称
return self.sheetbook.title def get_column_letter(self, Number=1):
# 返回某个列的标题名称
from openpyxl.utils import get_column_letter
return get_column_letter(Number) def replica_worksheet(self):
# 返回当前工作薄的复制体对象
copy_sheet = self.workbook.copy_worksheet(self.sheetbook)
return copy_sheet def total_row_columns(self, total=True):
"""
为真时,以行为一体,每行的数据信息
为假时,以列为一体,每列的数据信息
:param total:
:return:
"""
if total:
content = tuple(self.sheetbook.rows) # 单行中,列的数据
''' 打印长度
row_cell = tuple(word_sheet.rows)
row_max_row = len(row_cell) 行的长度
row_max_col = len(row_cell[0]) 列的长度
'''
else:
content = tuple(self.sheetbook.columns) # 单列中,行的数据
'''打印长度
col_cell = tuple(word_sheet.columns)
col_max_col = len(col_cell) 行的长度
col_max_row = len(col_cell[0]) 列的长度
'''
return content def attribute_template(self, emplate=None):
"""
将现有xlsx文档保存为xltx模板
:param emplate: 需要复制为xltx文档的名字
:return:
""" if type(emplate) in [str]: # 判断输入的内容是否为字符串
'''
将现有的表进行复制并保存为模板。。并后缀名为xltx,如果为xls和xlsx在打开的时候出现问题
1.判断是否字符串,防止传入数字或者其他类型的
2.切割一下是否含有xltx后缀名,有则说明可以直接有,没有就拿最后一个名字当做xltx文档的名字
3.如果为其他格式的就输出说明,
'''
genericpath = os.path.splitext(emplate)[1] # 切割文件后缀名 if genericpath == '.xltx':
attribute = os.path.split(emplate)[1] # 切割最后一个文件的名字
self.workbook.template = True # 属性设置
self.workbook.save(attribute) # 保存后缀名为xltx的文件
print('The xlsx document is completed by turning the xitx template.')
return attribute # 返回文件名 elif genericpath == '':
attribute = os.path.split(emplate)[1] + '.xltx' # 切割最后一个文件的名字
self.workbook.template = True # 属性设置
self.workbook.save(attribute) # 保存后缀名为xltx的文件
print('The xlsx document is completed by turning the xitx template.')
return attribute # 返回文件名 elif genericpath in ['xls', 'xlsx', 'txt']:
print('Files that do not support suffixes such as XLS xlsx text') else:
print('The input file suffix name does not conform.') elif emplate == None:
"""
如果没有传入名字,那么就拿当前xlsx文件的名字作为xltx的名字并在前面加上copy
"""
path = os.path.splitext(os.path.split(self.excel)[1])[0]
attribute = 'copy_' + path + '.xltx' # 设置文件的名字
self.workbook.template = True
self.workbook.save(attribute)
print('Xlsx turns xltx file.')
return attribute else:
print('你丫的文件输入有误') def attribute_document(self, template, document):
"""
将现有xltx模板转成xlsx文档进行保存
将现有的模板还原成文档或直接将现有的wb另存为。
保存为xls文件打开的时候会提示错误
:param template: xltx文件
:param document: 需要保存后的文件
:return:
"""
if os.path.exists(template): # 判断文件是否存在
"""
1.先判断xltx文件是否存在
2.在判断传入文件名字是否含有xlsx
"""
if os.path.splitext(template)[1] == '.xltx': # 判断模板是不是xltx文件
attribute = os.path.split(document) # 将文档切割。切成路径和文件两部分 if attribute[0] == '': # 判断路径是否为空,为空说明保存跟模板同一个位置 if os.path.splitext(attribute[1])[1] == '.xlsx': # 判断是否文档保存是否为xlsx文件
self.workbook.template = False
self.workbook.save(document)
print('The xitx template turns to the xlsx document.')
return document # 返回文件名
else:
print(document + ' : Not a File with a suffix xlsx')
elif os.path.exists(attribute[0]): # 有路径说明要保存在指定路径下面 if os.path.splitext(attribute[1])[1] == '.xlsx': self.workbook.template = False
self.workbook.save(document)
print('The xitx template turns to the xlsx document.')
return document # 返回文件名
else:
print(document + ' : Not a File with a suffix xlsx')
else:
print(document + ' : File path does not exist, please try again.')
else:
print(template + ' : Not a File with a suffix xltx')
else:
print(template + ' : File does not exist') class WRITEEXCEL:
def __init__(self, FILEPATH, SHEETTITLE='title', _INDEX=None):
"""
:param FILEPATH: 需要操作的文件路径
:param SHEETNAME: 工作薄名称,默认为title
"""
# 判断保存文件的位置是否存在
path = os.path.split(FILEPATH)
if os.path.exists(path[0]) or path[0] == '': # 检验文件是指定存储路径还是存储在本路径下
if os.path.splitext(path[1])[1] == '.xlsx': # 检验文件是否为xlsx格式的文件 self.excel = FILEPATH # 存储文件的路径保存
self.writeexcel_Data(_TITLE=SHEETTITLE, _INDEX=_INDEX) # 调用初始化函数,赋值标题
elif os.path.splitext(path[1])[1] == '.csv': # 检验文件是否为xlsx格式的文件
self.excel = FILEPATH # 存储文件的路径保存
self.writeexcel_Data(_TITLE=SHEETTITLE, _INDEX=_INDEX) # 调用初始化函数,赋值标题 else:
print(os.path.splitext(path[1])[1] + ' : 读取文件的格式不对')
else:
raise FileNotFoundError('文件不存在!') def writeexcel_Data(self, _TITLE, _INDEX):
"""
此处不严谨:如果输入的字符串都为数字那么就会出错
:param _TITLE:
:param _INDEX:
:return:
""" # 创建需要操作的文档
self.workbook = Workbook()
if type(_INDEX) in [int]:
self.create_sheet(_TITLE, _INDEX)
else:
self.active_sheet(_TITLE) def create_sheet(self, _TITLE, _INDEX):
"""
如果只创建一个工作薄的话不建议这个方式
例:
index设置为0时,会自动生成一个名为sheet的工作薄内容为空
设置为10时,自动生成9个空内容的工作薄,内存消耗大
"""
self.work_sheet = self.workbook.create_sheet(title=_TITLE, index=_INDEX) def active_sheet(self, _TITLE):
"""
单独创建一个工作薄.创建之后只有_TITLE标题的工作薄
:param _TITLE: 工作薄的标题
:return:
"""
self.work_sheet = self.workbook.active
self.work_sheet.title = _TITLE def save_woek_sheet(self):
# 保存工作薄
self.workbook.save(filename=self.excel) def content_cell_single(self, single, content):
"""
根据单个cell进行赋值
:param single: 位置
:param content: 内容
:return:
"""
self.work_sheet[single] = content def content_cell_row_col(self, col, row, value):
"""
该语句返回当前设置单元格的内容value
:param col:
:param row:
:param value:
:return:
"""
date_ex = self.work_sheet.cell(column=col, row=row, value=value)
return date_ex def content_row_append(self, content):
"""
对一整行直接写入.
如果文件已经写入内容时,那么就在下一行写入内容
:param content: 可以为list也可以是单个内容
:return:
"""
self.work_sheet.append(content) def get_column_letter(self, Number=1):
"""
返回指定列的标题名字
例:
A B
1 x y
2 z x
:param Number:
:return: 返回例子中A/B
"""
from openpyxl.utils import get_column_letter
return "{0}".format(get_column_letter(Number)) def time_transformation_timeStamp(self, dt):
# 时间转时间戳
if dt == None:
import datetime
dt = datetime.datetime.now()
return dt.timestamp() def datetime_transformation(self, dt):
# 时间戳转时间
return dt.fromtimestamp() def datetime_format(self, format="%Y-%m-%d %H:%M:%S"):
# 获取当前时间,并按照格式进行返回
import datetime
return datetime.datetime.now().strftime(format) def merge_excel(self, range):
"""
合并单元格
:param range: 需要合并的范围
:return:
"""
try:
self.work_sheet.merge_cells(range)
pass
except Exception:
print('Merge error') def ummerge_excel(self, range):
"""
拆除单元格。。。
注:
1.range如果并没有合并,那么执行这个语句会报错
2.原组合单元格的内容为N时,拆分后第一个单元格的内容为N
:param range: 现已经合并了,需要拆分的单元格
:return:
"""
try:
self.work_sheet.unmerge_cells(range)
pass
except Exception:
print('Break the merge error') def row_col_merge_excel(self, start_row=1, start_column=1, end_row=1, end_column=1):
"""
指定行列之后进行合并
注:
1.当start_row和end_row相等时,说明列之间进行合并
1.当start_column和end_column相等时,说明行之间进行合并
:param start_row: 开始行
:param start_column: 开始列
:param end_row: 结束行
:param end_column: 结束列
:return:
"""
try:
self.work_sheet.merge_cells(start_row=start_row, start_column=start_column, end_row=end_row,
end_column=end_column)
pass
except Exception:
print('Merge error') def row_col_ummerge_excel(self, start_row=1, start_column=1, end_row=1, end_column=1):
"""
指定行列之后进行拆分
注:
1.当start_row和end_row相等时,说明列之间进行拆分
2.当start_column和end_column相等时,说明行之间进行拆分
3.如果传入的单元格并没有合并,那么执行这个语句会报错
4.原组合单元格的内容为N时,拆分后第一个单元格的内容为N
:param start_row:开始行
:param start_column:开始列
:param end_row:结束行
:param end_column:结束列
:return:
"""
try:
self.work_sheet.unmerge_cells(start_row=start_row, start_column=start_column, end_row=end_row,
end_column=end_column)
pass
except Exception:
print('Break the merge error') def folding_column(self, min_range, max_range, hidden=False):
"""
折叠柱(轮廓)(将指定 column name 进行折叠)
:param min_range: 开始的位置
:param max_range: 结束的位置
:param hidden: should the group be hidden on workbook open or not
:return:
""" if type(min_range) in [str] and type(max_range) in [str]:
"""
1.先判断开始位置是否小于结束位置:思路:字符串长度以及ASCII的大小
"""
# 算出值的长度
length_min = len(min_range)
length_max = len(max_range) #  开始位置必须在结束位置的前面,所以先判断两个字母的长度
# 长度小于说明ASCII码也一定小于
if length_min < length_max:
self.work_sheet.column_dimensions.group(min_range, max_range, hidden=hidden) # 长度相等时,判断长度是不是为1.如果是说明不需要将字符串拆分之后进行计算
elif length_min == length_max and length_min == 1:
# 算出值的大小ASCII
number_min = ord(min_range)
number_max = ord(max_range) if number_min < number_max:
self.work_sheet.column_dimensions.group(min_range, max_range, hidden=hidden)
else:
print('When the length is 1, the ASCII is greater than the end....') elif length_min == length_max and length_min > 1:
# 算出值的大小ASCII
number_min = 0
number_max = 0 for number in min_range:
number_min = number_min + ord(number) for number in max_range:
number_max = number_max + ord(number) if number_min < number_max:
self.work_sheet.column_dimensions.group(min_range, max_range, hidden=hidden)
else:
print('When the length is not 1, ASCII is greater than the end....')
else:
print('dayle')
else:
print('The parameters given must be characters....') def worksheet_color(self, color='1072BA'):
# 设置工作薄标题颜色
self.work_sheet.sheet_properties.tabColor = color class PANDASDATA: def __init__(self, _data=None):
"""
接收excle中读取到的数据
:param _data: excle数据源
:return:
"""
self._data = _data def startPandasData(self, _data):
"""
接收excle中读取到的数据
:param _data: excle数据源
:return:
"""
self._data = _data
return self def conversion_series(self):
'''
将列表的数据进行转换
:return:
'''
series = pd.Series(self._data)
return series def definition_DataFrame(self, index, periods, columns=None):
'''
将字典的业内容进行系列化。
:param index: 字典中的序列号
:param columns: 字典中的key
:return:
例:
key1 key2
index1 1 1
index2 2 2
'''
dates = pd.date_range(index, periods=periods)
# 转换
return self.dataFrame(dates, columns) def dataFrame(self, index=None, columns=None):
'''
将字典业已的内容进行系列化。
:param index: 字典中的序列号
:param columns: 字典中的key
:return:
例:
key1 key2
index1 1 1
index2 2 2
'''
# 转换
df = pd.DataFrame(self._data, index=index, columns=columns)
return df def functionConcat(self, function, *frames):
'''
将多个DataFrame数据集合并之后,将其转成excle文档方便进行查看
:param function: 新创建的excle文件名
:param frames: 多个DataFrame合并后的数据集
:return:
'''
result = pd.concat(frames, keys=['readdata', 'storage', 'results'])
result.to_csv(function + ".csv", index=False, encoding="gbk") def contentConcat(self, *frames: "多个Dataframes数据"): result = pd.concat(frames)
return result def df_conversion(self, df, data_type='itertuples'):
'''
df转换成list的方法,然后给excle输入
:param df: 通过pandas转换出来的df数据
:param data_type: 指定转换的方法
:return:
'''
"""
data_type是判断你需要那类方式:运行效率
itertuples > enumerate > iterrows > range(index)/iloc
"""
if data_type == 'enumerate':
list_max = []
for i, row in enumerate(df.values):
list_data = []
for r in row:
list_data.append(r.value)
list_max.append(list_data)
return list_max
elif data_type == 'iterrows':
list_max = []
for i, row in df.iterrows():
list_data = []
for r in row:
list_data.append(r.value)
list_max.append(list_data)
return list_max
elif data_type == 'itertuples':
list_max = []
for row in df.itertuples():
list_data = []
for r in range(1, len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
return list_max
elif data_type == 'iloc':
list_max = []
for number in range(len(df)):
list_data = []
row = df.iloc[number]
for r in range(len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
return list_max
else:
print('openpyxlExcel 你确定自己输入正确了?、、、') def zip_col(self, df, index=1, number=None):
'''
通过zip方法,直接返回指定列的数据
:param df:
:param index: 需要返回的行
:param number: 需要返回的列
:return:
'''
if number is not None:
list_max = []
for row in zip(df, df[index], df[number]):
list_data = []
for r in range(1, len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
else:
list_max = []
for row in zip(df, df[index]):
list_data = []
for r in range(1, len(row)):
list_data.append(row[r].value)
list_max.append(list_data) def iloc_row(self, df, index=1):
"""
直接获取相应的行数据
df['c1'].iloc[x].dtype 指定列的内容,并打印数据类型
:param df: df数据对象
:param index: 需要获取的列位置
:return:
"""
if index < len(df):
content = df.iloc[index]
return content
else:
print('长度大于了。。。。。') def row_index_header(self, df, index=False, header=False):
'''
建议都为假。。。
header1 header2
index1 1 2
index2 3 4
打印之后的数据为:
[index1 , 1 , 2 ]
[index2 , 3 , 4 ]
:param df:
:param index: 为真时打印index标签的内容
:param header: 为真时打印headder标签的内容
:return:
'''
if index and header:
"""
都为真时,说明有首行header内容以及首列标签index
将标题以及标签的数据去除之后重新返回数据
"""
list_max = []
for row in dataframe_to_rows(df, index=index, header=header):
list_data = []
for r in range(1, len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
return list_max
elif index is True and header is False:
"""
index为真时,说明首列标签index保留
需要对header进行处理,header不是我们想要的数据
"""
list_max = []
for row in dataframe_to_rows(df, index=index, header=header):
list_data = []
for r in range(1, len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
return list_max
elif index is False and header:
"""
header为真时,说明首行header保留
需要对index进行处理,index不是我们想要的数据
"""
list_max = []
for row in dataframe_to_rows(df, index=index, header=header):
list_data = []
for r in range(len(row)):
list_data.append(row[r].value)
list_max.append(list_data)
return list_max
elif index is False and header is False:
"""
都为假时,说明首行header和标签index都没有返回这时不需要进行处理操作直接使用
"""
list_max = []
for row in dataframe_to_rows(df, index=index, header=header):
list_data = []
for r in range(len(row)):
list_data.append(row[r])
list_max.append(list_data)
return list_max
else:
print('bus') class OpenExcelPandas(READEXCEL, PANDASDATA): def __init__(self, name='', sheet=','):
"""
关于_date和_title的解释:
读取excel的数据时:
_date表示的文件的路径
_title表示的是工作薄的页面 或者 工作薄的名称 读取csv的数据时:
_date表示的文件的路径
_title表示的是该文件的分隔符。例如‘,’逗号 通过pandas进行转换时:
_date 表示的数据
_title 表示标题
:param name:
:param sheet:
"""
self._data = name
self._title = sheet def readCaseExcel(self, title='函数'):
# 创建工作薄workbook对象
self.startReadExcel(self._data, self._title) if self._title else self.startReadExcel(self._date) # 将case中内容部分的数据(除标题以外的数据)读出
# 将case中标题的全部内容读出
self._data, self._title = self.coordinates_sheet_row_value()
# 通过pandas将数据进行转换
return self.conversionPandas(title) def internal_pandas_read(self, title='函数'):
genericpath = os.path.splitext(self._date)[1] # 切割文件后缀名
if 'xlsx' in genericpath:
return self.internal_read_excel(title)
elif 'csv' in genericpath:
return self.internal_read_csv(title)
else:
print("If pandas read the document information, they should pass in the formatted document..") def internal_read_excel(self, title="函数"):
'''
利用pandas内置函数,直接读取xlsx的数据信息
并将函数名提取出来,用于序列号的赋值
:return:
'''
self._data = pd.read_excel(self._data, self._title)
if title:
columnLabel = list(self._data[title]) # 设置序列号的名字
return self.conversion_column(self._data, columnLabel)
else:
return self.conversion_column(self._data, None) def internal_read_csv(self, title="函数"):
'''
读取csv文档数据。sep 为csv切割符号
header 指定行为矩阵的key
engine 最好写吧,不然容易意不意外惊不惊喜
:param title: 矩阵中,拿来设置序列号的相应行key
:return:
'''
self._data = pd.read_csv(self._date, sep=self._title, header=0, engine='python')
if title:
columnLabel = list(self._data[title]) # 设置序列号的名字
return self.conversion_column(self._data, columnLabel)
else:
return self.conversion_column(self._data, None) def conversionPandas(self, title="函数"):
'''
通过已读取的
:param title:
:return:
''' self._data = self.dataFrame(columns=self._title) # 设置标题名
if title:
columnLabel = list(self._data[title]) # 设置序列号的名字
return self.conversion_column(self._data, columnLabel)
else:
return self.conversion_column(self._data, None) def conversion_column(self, df, columnLabel=None):
if columnLabel:
df = df.set_index([columnLabel]) # 设置df数据中的序列号
return df.fillna(value='')

三: 读取ini 跟yaml文件

1. 通过configparser来读取ini文件

2. 通过yaml来读取yaml文件

3. 整体代码为

import os
import yaml
import configparser class ReadModelIni(object):
"""
读取ini文件
""" def __init__(self, file_name: str, file_path: str = None) -> None:
"""
实例化ini文件读取对象
:param file_name: 需要读取的文件名字,需要传入文件后缀名
:param file_path: 需要读取的文件所在路径
"""
self.conf = None
# 判断文件位置是否传入
if file_path:
self.file_path = file_path
else:
# 此处写死的原因:配置文件所在的目录跟项目代码目录不为同一个地址
self.file_path = os.path.join("E:\\hezhan", 'configs') # 给内部参数file_name赋值
self.file_name = file_name config_path = os.path.join(self.file_path, self.file_name)
self.read_ini_file(config_path)
pass def read_ini_file(self, config_path):
"""
将ini文件内的数据转成dict
:param config_path: 需要读取的ini文件
:return:
""" self.conf = configparser.ConfigParser()
self.conf.read(config_path)
pass def get_value(self, section, key):
"""
通过key值获取相应的数据信息
:param section:
:param key:
:return:
"""
try:
value = self.conf.get(section, key)
except Exception as e:
value = None
print(e)
return value class ReadModelYaml(object):
"""
读取yaml文件数据
""" def __init__(self, file_name, file_path=None):
"""
实例化yaml文件读取对象
:param file_name: 需要读取的文件名字,需要传入文件后缀名
:param file_path: 需要读取的文件所在路径
""" # 判断文件位置是否传入
self.pageElements = {}
if file_path:
self.file_path = file_path
else:
cur_path = os.path.abspath(os.path.dirname(os.getcwd()))
self.file_path = os.path.join(cur_path, 'configs') self.file_name = file_name yaml_file_path = os.path.join(self.file_path, self.file_name)
self.read_parse_yaml(yaml_file_path) def read_parse_yaml(self, yaml_file_path):
"""
指定文件路径以及文件名来读取数据信息
:param yaml_file_path: 文件路径
:return:
"""
# 排除一些非.yaml的文件
if '.yaml' in str(yaml_file_path):
with open(yaml_file_path, 'r', encoding='utf-8') as f:
page = yaml.load(f)
self.pageElements.update(page) def get_value(self, key):
"""
根据key来获取数据信息
:param key:
:return:
"""
try:
value = self.pageElements[key]
except Exception as e:
value = None
print("ReadModelYaml 读取时没有找到关键字%s----%s" % (key, e))
return value

项目所在位置:

https://github.com/namexiaohuihui/demotest

unittest 运行slenium(一)---创建配置类的更多相关文章

  1. Spring boot运行原理-自定义自动配置类

    在前面SpringBoot的文章中介绍了SpringBoot的基本配置,今天我们将给大家讲一讲SpringBoot的运行原理,然后根据原理我们自定义一个starter pom. 本章对于后续继续学习S ...

  2. unittest 运行slenium(三)---通过数据驱动形式运行用例

    一: 获取数据 获取用例所在位置,通过OpenExcelPandas来读取用例里面的全部数据.通过某个列名来创建新的序号. 并将结果转换成list类型,将其作为ddt数据的来源. 1.  在test文 ...

  3. unittest 运行slenium(二)---打开浏览器及元素操作

    一: 打开win10中安装的浏览器 1. 打开的浏览器有:谷歌/火狐/ie/edge 2. 当浏览器的driver没有配置在path环境下时,在启动浏览器时需要传入driver的所在位置 3. 其中火 ...

  4. unittest 运行slenium(五)---运行代码并生成HTMLTestRunner报告

    整体代码如下: import os import sys import time import datetime import unittest import HTMLTestRunner # git ...

  5. unittest 运行slenium(四)---通过指定用例的形式运行用例

    一: 说明 跟数据驱动唯一的区别为用例数据获取时,及运行方式不同. 其它都基本相同,可参考https://www.cnblogs.com/xiaodingdong/p/11753220.html 二: ...

  6. spring 自己创建配置类

  7. 配置类为什么要添加@Configuration注解呢?

    配置类为什么要添加@Configuration注解呢? 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 推荐阅读: Spring官网阅读 | 总结篇 Spring ...

  8. DotNetCore学习-1.读取Json配置并绑定到配置类实例

    DotNetCore的程序的配置不再完全局限于XML文件,增加更加通用的Json配置. 读取Json配置文件的类主要在Microsoft.Extensions.Configuration命名空间下,创 ...

  9. 在命令行中运行eclipse中创建的java项目

    在命令行中运行eclipse中创建的java项目 博客分类: java相关 javaeclipse命令行  由于项目要求,需要对eclipse中的项目进行打包,似的可以在客户机上不装eclipse的情 ...

随机推荐

  1. php环境选择

    第一个    PHPStudy 推荐这个.简单好用. 链接:https://pan.baidu.com/s/1yWRDjfnadkkUE-JX5pqZmg 提取码:4imw 第二个 PHPnow 第三 ...

  2. 【JS新手教程】JS中的split()方法,拆分字符串

    该方法具体如代码和图中的注释,直接在语句后面加注释了.格式:要拆分的字符串.split(拆分依据的字符)例如该文中的例子,拆分人名,电话,地址.该文中用了个文本框,文本框中需要输入的格式是:人名,电话 ...

  3. 玩转CONSUL(2)–分布式锁

    1. 前言 分布式锁的场景,大家应该都有遇到过.比如对可靠性有较高要求的系统中,我们需要做主备切换.这时我们可以利用分布式锁,来做选主动作,抢到锁作为主,执行对应的任务,剩余的实例作为备份 redis ...

  4. 安装本地 jar 文件

    Maven 提供了 maven-install-plugin 可将 jar 文件安装至本地 repository.安装命令如下: mvn install:install-file -Dfile= -D ...

  5. 第07组 Alpha冲刺(1/4)

    队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:完成人员分配,初步学习Android开发 Github签入记录 接下来的计划:继续完成Android开发的学习,带领团队进行前后端开 ...

  6. PHP curl模拟ip和来源进行访问

    PHP curl模拟ip和来源进行访问<pre> public function moniurlqingqiu() { $ch = curl_init(); $curlurl = &quo ...

  7. QT 源码分析--1

    Ref: http://blog.sina.com.cn/s/blog_6e80f1390100qoc0.html 安装qt之后(我使用的是online自动安装),安装目录下有\5.10.1\Src\ ...

  8. 怎样ubuntu下命令行终端显示短路径

    参考:http://blog.sina.com.cn/s/blog_b71132f001016cmm.html ubuntu的终端命令行默认是长路径,即把路径深度全部显示出来,操作起来不是很方便,下面 ...

  9. git将代码提交到多个远程仓库

    在项目目录下执行: git remote set-url --add origin http://mayun.cn/xxx/adsdsdsdcelery-demo.git 即可添加一个远程仓库. 再执 ...

  10. java8中常用的新功能

    Lambda表达式的用法,并行流.Optional.循环.线程池等