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