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))))