Python Utils

SpikeKing發表於2018-04-24

在Python開發中,將常用功能封裝成為介面,並放入Utils工具類中,直接呼叫,可以提升效率。

常用的函式有:

  • 資料夾遍歷
  • 資料夾建立
  • 檔案讀取
  • 時間可讀
  • 時間統計
  • 安全除法
  • 雙列表排序
  • 配置讀取
  • 指令碼路徑
  • Numpy判空

資料夾遍歷

遍歷資料夾函式提供的功能和擴充套件,如下:

  1. 返回檔案的路徑和名稱;
  2. 根據字尾名篩選檔案;
  3. 去除隱藏檔案,即以“.”開頭的檔案;

實現:

def traverse_dir_files(root_dir, ext=None):
    """
    列出資料夾中的檔案, 深度遍歷
    :param root_dir: 根目錄
    :param ext: 字尾名
    :return: [檔案路徑列表, 檔名稱列表]
    """
    names_list = []
    paths_list = []
    for parent, _, fileNames in os.walk(root_dir):
        for name in fileNames:
            if name.startswith('.'):  # 去除隱藏檔案
                continue
            if ext:  # 根據字尾名搜尋
                if name.endswith(tuple(ext)):
                    names_list.append(name)
                    paths_list.append(os.path.join(parent, name))
            else:
                names_list.append(name)
                paths_list.append(os.path.join(parent, name))
    paths_list, names_list = sort_two_list(paths_list, names_list)
    return paths_list, names_list
複製程式碼

資料夾建立

建立資料夾函式提供的功能和擴充套件,如下:

  1. 當資料夾不存在時,建立資料夾;
  2. 當資料夾存在時,根據引數,是否刪除資料夾;

實現:

def mkdir_if_not_exist(dir_name, is_delete=False):
    """
    建立資料夾
    :param dir_name: 資料夾
    :param is_delete: 是否刪除
    :return: 是否成功
    """
    try:
        if is_delete:
            if os.path.exists(dir_name):
                shutil.rmtree(dir_name)
                print u'[INFO] 資料夾 "%s" 存在, 刪除資料夾.' % dir_name

        if not os.path.exists(dir_name):
            os.makedirs(dir_name)
            print u'[INFO] 資料夾 "%s" 不存在, 建立資料夾.' % dir_name
        return True
    except Exception as e:
        print '[Exception] %s' % e
        return False
複製程式碼

檔案讀取

檔案讀取函式提供的功能和擴充套件,如下:

  • 實現便捷地檔案讀取功能;
  • 當引數mode是one時,讀取1行;
  • 當引數mode是more時,讀取多行;

實現:

def read_file(data_file, mode='more'):
    """
    讀檔案, 原檔案和資料檔案
    :return: 單行或陣列
    """
    try:
        with open(data_file, 'r') as f:
            if mode == 'one':
                output = f.read()
                return output
            elif mode == 'more':
                output = f.readlines()
                return map(str.strip, output)
            else:
                return list()
    except IOError:
        return list()
複製程式碼

時間可讀

可讀時間函式提供的功能和擴充套件,如下:

  • 輸入時間戳(如time.time()),輸出可讀時間str
  • 輸出格式是年-月-日 時:分:秒

實現:

def timestamp_2_readable(time_stamp):
    """
    時間戳轉換為可讀時間
    :param time_stamp: 時間戳,當前時間:time.time()
    :return: 可讀時間字串
    """
    return datetime.fromtimestamp(time_stamp).strftime('%Y-%m-%d %H:%M:%S')
複製程式碼

時間統計

時間統計函式提供的功能和擴充套件,如下:

  1. 顯示起始和結束時間;
  2. 統計執行的數,可以用於統計單次耗時;

實現:

start_time = datetime.now()  # 起始時間
print "[INFO] 當前時間: %s" % timestamp_2_readable(time.time())

time.sleep(10)

print "[INFO] 結束時間: %s" % timestamp_2_readable(time.time())
elapsed_time = (datetime.now() - start_time).total_seconds()  # 終止時間
print "[INFO] 耗時: %s (秒)" % elapsed_time
複製程式碼

安全除法

安全除法函式提供的功能和擴充套件,如下:

  1. 基本的除法功能;
  2. 轉換為浮點數(float);
  3. 避免除數為0,當除數為0時,直接返回0.0;

實現:

def safe_div(x, y):
    """
    安全除法
    :param x: 被除數 
    :param y: 除數
    :return: 結果
    """
    x = float(x)
    y = float(y)
    if y == 0.0:
        return 0.0
    else:
        return x / y
複製程式碼

雙列表排序

雙列表排序函式提供的功能和擴充套件,如下:

  1. 同時排序列表1和列表2;
  2. 兩個列表的對應順序不變;

實現:

def sort_two_list(list1, list2):
    """
    排序兩個列表
    :param list1: 列表1
    :param list2: 列表2
    :return: 排序後的兩個列表
    """
    list1, list2 = (list(t) for t in zip(*sorted(zip(list1, list2))))
    return list1, list2
複製程式碼

配置讀取

配置讀取函式提供的功能和擴充套件,如下:

  • 配置檔案是JSON格式;
  • 配置檔案轉換為配置類配置字典

實現:

import json
from bunch import Bunch

def get_config_from_json(json_file):
    """
    將配置檔案轉換為配置類
    :param json_file: json檔案
    :return: 配置資訊
    """
    with open(json_file, 'r') as config_file:
        config_dict = json.load(config_file)  # 配置字典
    config = Bunch(config_dict)  # 將配置字典轉換為類
    return config, config_dict
複製程式碼

Numpy判空

  • 空的NdArray可以用於異常處理;
  • 當NdArray的屬性size值為0時,NdArray為空。
import numpy as np
a = np.array([])
print a.size # 0
複製程式碼

指令碼路徑

當執行Python指令碼時,路徑未包含當前工程,需要強制指定資料夾位置(dirname),否則無法找到同工程中的其他類。

以下是二層路徑的實現,當層次較多時,巢狀多次os.path.dirname即可。

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:
    sys.path.append(p)
複製程式碼

歡迎Follow我的GitHub:https://github.com/SpikeKing

By C. L. Wang

That's all! Enjoy it!

相關文章