python一些常用代碼塊

centos下 python3無法print中文

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-10: ordinal not in range(128

這類問題多來源於python控制檯的編碼問題,進入python環境

>>> import sys
>>> sys.stdout.encoding
'ANSI_X3.4-1968'

發現這裏的編碼不是utf-8,而是一個ANSI_X3.4-1968,工程字符集,我們應該要將其改爲utf-8纔行。
在root用戶下聲明編碼:

export LC_ALL='en_US.UTF-8'
export PYTHONIOENCODING='utf-8'

再到python環境試一下,發現可以了,這種情況下python輸出中文就不會亂碼了

>>> import sys
>>> sys.stdout.encoding
'utf-8'

日誌文件(即在控制檯打印也會寫入到日誌文件)

import datetime
import logging
from logging import handlers
​
class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }  # 日誌級別關係映射
​
    def __init__(self, filename, level='info', when='D', backCount=3,
                 fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)  # 設置日誌格式
        self.logger.setLevel(self.level_relations.get(level))  # 設置日誌級別
        sh = logging.StreamHandler()  # 往屏幕上輸出
        sh.setFormatter(format_str)  # 設置屏幕上顯示的格式
        th = handlers.TimedRotatingFileHandler(filename=filename, when=when, backupCount=backCount,
                                               encoding='utf-8')  # 往文件裏寫入#指定間隔時間自動生成文件的處理器
        # 實例化TimedRotatingFileHandler
        # interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:
        # S 秒
        # M 分
        # H 小時、
        # D 天、
        # W 每星期(interval==0時代表星期一)
        # midnight 每天凌晨
        th.setFormatter(format_str)  # 設置文件裏寫入的格式
        self.logger.addHandler(sh)  # 把對象加到logger裏
        self.logger.addHandler(th)
        
# 實例化log對象
date = datetime.datetime.now().strftime('%Y%m%d')
Log = Logger('/log/'+date+'.log', level='debug').logger
​
# 日誌使用
from logger import Log
Log.info(msg=(count1, cid, url))
Log.debug(msg=(count1, cid, url))
Log.error(msg=(count1, cid, url))
Log.warning(msg=(count1, cid, url))

生成隨機ID

import random
def createId(self, length):
    _letter_cases = "abcdefghijklmnopqrstuvwxyz"
    _upper_cases = _letter_cases.upper()
    _numbers = ''.join(map(str, range(0, 10)))
    init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
    result = ""
    for i in range(length):
        result = result + (random.choice(init_chars))
        return result

將瀏覽器的Headers轉換爲字典

def format_headers(string) -> dict:
    """
    將在Chrome上覆制下來的瀏覽器UA格式化成字典,以\n爲切割點
    :param string: 使用三引號的字符串
    :return:
    """
    string = string.strip().split('\n')
    new_headers = {}
    for key_value in string:
        key_value_list = key_value.split(':')
        if len(key_value_list) > 2:
            new_headers.update({key_value_list[0]: ':'.join(key_value_list[1::])})
        else:
            new_headers.update({key_value_list[0]: key_value_list[1]})
    return new_headers

62進制數與10進制轉換

def encode_b64(n):
    table = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    result = []
    temp = n
    if temp < 62:
        result.append(table[temp])
    else:
        while 0 < temp:
            result.append(table[temp % 62])
            temp = temp // 62
    return ''.join([x for x in reversed(result)])
​
def decode_b64(str):
    table = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5,
             "6": 6, "7": 7, "8": 8, "9": 9,
             "a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15, "g": 16,
             "h": 17, "i": 18, "j": 19, "k": 20, "l": 21, "m": 22, "n": 23,
             "o": 24, "p": 25, "q": 26, "r": 27, "s": 28, "t": 29, "u": 30,
             "v": 31, "w": 32, "x": 33, "y": 34, "z": 35,
             "A": 36, "B": 37, "C": 38, "D": 39, "E": 40, "F": 41, "G": 42,
             "H": 43, "I": 44, "J": 45, "K": 46, "L": 47, "M": 48, "N": 49,
             "O": 50, "P": 51, "Q": 52, "R": 53, "S": 54, "T": 55, "U": 56,
             "V": 57, "W": 58, "X": 59, "Y": 60, "Z": 61,
             }
    result = 0
    for i in range(len(str)):
        result *= 62
        result += table[str[i]]
    return result
​
#補齊位數,將原有的字符串補齊至6位字符串
def fill_zero(str1):
    if len(str1) < 6:
        zero_str = ""
        for i in range(6-len(str1)):
            zero_str += '0'
        result = zero_str + str1
    return result
​
print(decode_b64(fill_zero(encode_b64(1000))))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章