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格式化成字典,以
为切割点
    :param string: 使用三引号的字符串
    :return:
    """
    string = string.strip().split('
')
    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))))

原文地址:https://www.cnblogs.com/triangle959/p/12024357.html