12.4 工具类
在一个项目中,"utils"目录通常用于存放通用的工具函数或类。这些工具函数或类可以在整个项目的不同部分被多次使用,以提供一些常见的功能和操作。通常,"utils"目录中的文件包括与数据处理、文件读写、日志记录、异常处理、图像处理、配置读取等相关的工具函数或类。这样的目录结构可以帮助项目保持整洁和组织,使开发人员能够更轻松地复用和管理这些通用工具。
12.4.1 读取文件
编写文件read_utils.py定义一些用于读取文件的函数,这些函数提供了方便的方法来读取各种类型的文件和数据,并将它们转换为适当的数据结构以供进一步处理和分析。文件read_utils.py的主要实现代码如下所示。
def read_csv(file_path, **kargs):
if len(kargs.keys()) == 3:
return pd.read_csv(file_path,
converters = kargs['converters'],
usecols = kargs['usecols'],
dtype = kargs['dtype'],
)
else:
return pd.read_csv(file_path)
def read_from_parquet(file_path):
return pd.read_parquet(file_path)
def read_from_pickle(file_path, compression = 'gzip'):
if compression == '':
return pd.read_pickle(file_path)
else:
return pd.read_pickle(file_path, compression = compression)
def read_yaml_file(file_path):
with open(file_path, "rb") as yaml_file:
return yaml.safe_load(yaml_file)
def read_yaml_key(file_path, key, subkey = None):
config = read_yaml_file(file_path)
value = config[key]
if subkey != None:
value = value[subkey]
return value
def read_compressed_numpy_array_data(file_path):
return np.load(file_path)['arr_0']
def read_object(file_path: str, ) -> object:
with open(file_path, "rb") as file_obj:
return dill.load(file_obj)
- read_csv(file_path, **kargs):读取csv文件并返回一个Pandas数据帧(DataFrame)。此函数可以接受一些关键字参数,包括converters(转换器函数)、usecols(要读取的列)和dtype(列的数据类型)。
- read_from_parquet(file_path): 从Parquet文件中读取数据,并返回一个Pandas数据帧。
- read_from_pickle(file_path, compression='gzip'): 从pickle文件中读取数据,并返回一个Pandas数据帧。可以选择使用压缩(gzip)。
- read_yaml_file(file_path): 从YAML文件中读取数据,并返回一个字典。
- read_yaml_key(file_path, key, subkey=None) :从YAML配置文件中读取指定的键(key)的值,并返回。可以选择读取键的子键(subkey)的值。
- read_compressed_numpy_array_data(file_path) :从文件中加载压缩的NumPy数组数据,并返回一个NumPy数组。
- read_object(file_path: str) -> object:从文件中加载对象(通过使用dill库进行序列化),并返回该对象。
12.4.2 写入、保存数据
编写文件write_utils.py,定义了一些用于保存数据的函数,这些函数能够将数据保存到不同的文件格式中,如Parquet、pickle、YAML和压缩的NumPy数组。通过这些函数,可以将数据保存到文件以供以后使用或共享。文件write_utils.py的具体实现代码如下所示。
def save_to_parquet(df, file_path, replace = False):
if replace:
if os.path.exists(file_path):
os.remove(file_path)
os.makedirs(os.path.dirname(file_path), exist_ok = True)
df.to_parquet(file_path)
def save_to_pickle(df, file_path, replace = False):
if replace:
if os.path.exists(file_path):
os.remove(file_path)
os.makedirs(os.path.dirname(file_path), exist_ok = True)
df.to_pickle(file_path, compression = 'gzip', protocol = 4)
def save_yaml_data(file_path, content, replace = False):
if replace:
if os.path.exists(file_path):
os.remove(file_path)
os.makedirs(os.path.dirname(file_path), exist_ok = True)
with open(file_path, "w") as file:
yaml.dump(content, file)
def save_compressed_numpy_array_data(file_path, array):
dir_path = os.path.dirname(file_path)
os.makedirs(dir_path, exist_ok = True)
np.savez_compressed(file_path, array)
def save_object(file_path: str, obj: object) -> None:
logging.info("save_object method of main_utils class started.")
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, "wb") as file_obj:
dill.dump(obj, file_obj)
logging.info("save_object method of main_utils class ended.")
- save_to_parquet(df, file_path, replace=False): 将数据帧(DataFrame)保存为Parquet文件。在保存之前,它会检查目录是否存在,如果不存在则会创建目录。可以选择是否替换已存在的文件。
- save_to_pickle(df, file_path, replace=False): 将数据帧(DataFrame)保存为pickle文件。在保存之前,它会检查目录是否存在,如果不存在则会创建目录。可以选择是否替换已存在的文件。
- save_yaml_data(file_path, content, replace=False): 将内容保存到YAML文件中。在保存之前,它会检查目录是否存在,如果不存在则会创建目录。可以选择是否替换已存在的文件。
- save_compressed_numpy_array_data(file_path, array): 将NumPy数组数据保存为压缩文件格式(.npz)。在保存之前,它会检查目录是否存在,如果不存在则会创建目录。
- save_object(file_path: str, obj: object) -> None: 将对象保存到文件中(通过使用dill库进行序列化)。在保存之前,它会检查目录是否存在,如果不存在则会创建目录。