python3 unicode字符串_【已解决】Python3中如何声明字符串是unicode类型以避免log日志打印出错...

Python3中代码:

CreateTableSqlTemplate = """CREATE TABLE IF NOT EXISTS `%s` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增,主键’,

`cityDealerPrice` int(11) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘经销商参考价’,

`msrpPrice` int(11) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘厂商指导价’,

`mainBrand` char(20) NOT NULL DEFAULT ” COMMENT ‘品牌’,

`subBrand` varchar(20) NOT NULL DEFAULT ” COMMENT ‘子品牌’,

`brandSerie` varchar(20) NOT NULL DEFAULT ” COMMENT ‘车系’,

`brandSerieId` varchar(15) NOT NULL DEFAULT ” COMMENT ‘车系ID’,

`model` varchar(50) NOT NULL DEFAULT ” COMMENT ‘车型’,

`modelId` varchar(15) NOT NULL DEFAULT ” COMMENT ‘车型ID’,

`modelStatus` char(5) NOT NULL DEFAULT ” COMMENT ‘车型状态’,

`url` varchar(200) NOT NULL DEFAULT ” COMMENT ‘车型url’,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""

logging.info("config=%s, needCreateTable=%s, tableName=%s, createTableSqlTemplate=%s",

config, needCreateTable, tableName, createTableSqlTemplate)

结果出错:

Traceback (most recent call last):

File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/logging/__init__.py", line 994, in emit

stream.write(msg)

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 334-338: ordinal not in range(128)

然后

试了试:

logging.info("createTableSqlTemplate=%s", createTableSqlTemplate.encode("utf-8"))

结果:

createTableSqlTemplate=b"CREATE TABLE IF NOT EXISTS `%s` (….

输出了bytes,是不会出错,但是输出到都是\xxxx,不方便查看原始内容了。

然后也试了试加u前缀:

CreateTableSqlTemplate = u"""CREATE TABLE IF NOT EXISTS `%s` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增,主键’。。。。"""

问题依旧。

所以想要搞清楚Python3中,如何声明是unicode字符串

python 3 unicode string

python 3 declare unicode string

试试:

logging.info("createTableSqlTemplate=%s", str(createTableSqlTemplate))

结果问题依旧。

试试:

CreateTableSqlTemplate = b”""xxx""".decode("utf-8")

结果:

SyntaxError: bytes can only contain ASCII literal characters.

试试:

CreateTableSqlTemplate = “""xxx""".encode("utf-8").decode("utf-8")

结果:

问题类似:

Traceback (most recent call last):

File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/logging/__init__.py", line 994, in emit

stream.write(msg)

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 152-156: ordinal not in range(128)

貌似出错的position位置变了?

python 3  UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position  ordinal not in range(128)

此处Python文件最开始已经指明文件编码为utf-8了:

#!/usr/bin/python

# -*- coding: utf-8 -*-

且文件本身的确是utf-8编码:

要用到PYTHONIOENCODING?

感觉不太对

试试:

import sys

import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=’utf-8′)

结果问题依旧。

试试:

CreateTableSqlTemplate = str(“""xxx""")

结果:

问题依旧。

此处,好像是这个中文的逗号:

导致出错的。

-》当然可以直接删除掉,但是不是好的做法。

还是希望此处可以正常输出这个逗号的。

去给PyCharm的debug加上:

PYTHONIOENCODING=utf-8

试试

结果:

没法允许。去加上环境变量中:

问题依旧。

去给filehandler中加上编码

logging.basicConfig(

level    = fileLogLevel,

format   = fileLogFormat,

datefmt  = fileLogDateFormat,

filename = logFilename,

encoding = "utf-8",

filemode = ‘w’)

结果:

ValueError: Unrecognised argument(s): encoding

python 3 logging.basicConfig encoding

没有提到encoding或encode

说是不要用basicConfig,换成logging.FileHandler,自己设置文件编码

然后试试自己使用fileHandler

rootLogger = logging.getLogger()

rootLogger.setLevel(fileLogLevel)

fileHandler = logging.FileHandler(

filename=logFilename,

mode=’w’,

encoding="utf-8")

fileHandler.setFormatter = logging.Formatter(

fmt=fileLogFormat,

datefmt=fileLogDateFormat

)

rootLogger.addHandler(fileHandler)

结果:

就可以正常打印log了:

【总结】

此处Python3中,对于定义好了的一个字符串:

someStr = """xxx"""

其中xxx中包含了一个中文的逗号,然后去logging去打印日志,然后出错:

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 334-338: ordinal not in range(128)

最后确定根本原因是:

初始化logging时,用的是basicConfig,不支持指定文件编码

导致默认fileHandler的文件编码(估计)是ASCII,然后无法输出此处中文字符

解决办法是:

设置logging的fileHandler的(文件的)encoding

具体做法:

rootLogger = logging.getLogger()

rootLogger.setLevel(fileLogLevel)

fileHandler = logging.FileHandler(

filename=logFilename,

mode=’w’,

encoding="utf-8")

fileHandler.setFormatter = logging.Formatter(

fmt=fileLogFormat,

datefmt=fileLogDateFormat

)

rootLogger.addHandler(fileHandler)

然后即可正常输出日志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux awstats搭建

1安装lnmp模式 2安装awstats 2# tar xf awstats-6.5.tar.gz 解压下载到/root下的压缩包 mkdir /var/lib/awstats chmod 755 /usr/local/awstats #cp -R awstats-6.5/ /usr/local/awstats cd /usr/local/awstats/ 进入到解压目录下 ls docs README.TXT tools wwwroot cd tool…

java实现坐标图进行拖拉拽放_js实现限定区域范围拖拉拽效果

本文实例为大家分享了js实现限定区域范围拖拉拽的具体代码,供大家参考,具体内容如下需要在范围内拖拉拽,之前看来许多资料觉得都不是特别满足要求,今天自己写了一个,通过监听鼠标按下、鼠标抬起、鼠标移动事件来控制代…

上拉加载更多后台数据_微信小程序端操作云数据库

一、分清几个概念1、云开发,简言之就是可以直接用微信小程序开发者工具完成一个从前台到后台的小程序项目。2、小程序端,使用云开发的时候,miniprogram中写的代码可以叫做小程序端(真实是我不知道可以不可以这么认为)。…

关于springMVC传参问题

今天写项目,碰到一个以前灭有注意到的问题,一般情况下使用springMVC Controller注解之后,被此注解标记的方法的参数名只需要跟页面表单的标签的name的值相同即可拿到页面的值,但是如果标签加了disabled"disabled" 属性…

mysql + keepalived高可用

1上次说过了mysql的主从配置 tar zxf keepalived-1.2.7.tar.gz cd keepalived-1.2.7 yum install gcc gcc-c yum install kernel-devel -y 2报错 configure: error: Popt libraries is required yum install popt-devel 3继续执行 ./configure --with-kernel-dir/usr/src/kerne…

java+向前进一_Java 线程基础

前言线程并发系列文章:熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性、操作的原子性,进而扩展出的Volatile、锁(CAS/Synchronized/Lock)、信号量等知识。有些文章只说笼统…

python如何给定取值范围_python怎么限定函数自变量取值范围

匿名用户1级2017-11-20 回答Python中函数参数的定义主要有四种方式:1. F(arg1,arg2,…)这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提…

tp5无刷新分页

控制器 <?phpnamespace app\index\controller; use think\Db; class Index{ public function userlist() { $listDb::name(users)->paginate(10,false, [ type > Bootstrap, var_page > page, //使用jqery 无刷新分页 path>javascript:AjaxPage([PAGE]); ]); r…

安装kickstart失败

yum -y install dhcp*yum -y install tftp*yum -y install nfs修改tftp配置文件 default: off description: The tftp server serves files using the trivial file transfer \ protocol. The tftp protocol is often used to boot diskless \ workstations, download conf…

java内存溢出让tomcat停止_java - 使用JVM Open J9一段时间后,应用程序(tomcat)停止响应 - 堆栈内存溢出...

我正在使用Open J9&#xff0c;一段时间后我的应用程序停止响应。.在生产中发生了2个小时后&#xff0c;在本地设法使用JMeter进行模拟。 应用程序(tomcat)只是停止响应&#xff0c;我需要重新启动才能将其取回。 问题是日志(catalina和log4j)中没有任何内容可以帮助我进行调查…

电子报账系统源码_网上商城系统建设心得,轻松搞定选择困难

当前&#xff0c;我们正处于一个互联网飞速发展的时代&#xff0c;特别是互联网电商的出现&#xff0c;给我们的生活带来了翻天覆地的变化&#xff0c;不出家门便可购买各种商品&#xff0c;不用再到处奔走寻找&#xff0c;通过网络便可快速下单&#xff0c;然后坐等送货上门。…

前端现在到底需要什么样的人才

昨天和几个大佬们在一起聊聊前端的技术。 大致内容如下&#xff1a; 1.前端三剑客 Html css javascript 这是必不可少的&#xff0c;其中js是核心。 2.框架之所以火,并不是它本身有多牛逼&#xff0c;而是大家都在用&#xff0c;间接把它吹棒起来了。为什么&#xff1f; 框…

源码安装httpd

1 tar -xvf apr-1.7.0.tar.gz tar -xvf apr-util-1.6.1.tar.gz tar -xvf httpd-2.2.6.tar.gz 2cd apr-1.7.0 ./configure Make Make install 3cd apr-util-1.6.1 ./configure --with-apr/usr/local/apr 解决rpm -ivh libexpat-devel-2.2.4-alt1.i586.rpm tar -xvf expat-2.2…

python 获取字符串中的字典_python cookies提取——从字符串到字典(一行Python代码)...

def extract_cookies(cookie):"""从浏览器或者request headers中拿到cookie字符串&#xff0c;提取为字典格式的cookies"""cookies dict([l.split("", 1) for l in cookie.split("; ")])return cookiesif __name__ "…

python如何运行py程序_如何用Python汇款:Web3.py教程

Python开发人员对于以太坊和区块链库的技术练习。警告&#xff1a;下面的教程包含这些元素&#xff1a;显式加密、点对点金融服务以及可能的违规行为。这些例子仅仅是为了说明Python区块链的强大功能和便捷性。嗨&#xff0c;Pythoners&#xff0c;你们好&#xff01;我真的很喜…

基于域名的apache服务器

1承接上个博客说的&#xff0c;咱们继续扩展 Cd /usr/local/apache2/conf /usr/local/apache2/conf/extra扩展文件 Vi httpd-vhosts.conf <VirtualHost *:80> ServerAdmin 1327629137qq.com DocomentRoot “/data/webapps/www1” ServerName www.wugk1.com <Directory…

MySQL 数据库修改登录密码

MySQL 数据库修改登录密码、、 -------- mysql修改密码 默认的密码为空&#xff1a;mysql -u root -p第一次更改密码&#xff1a;mysqladmin -uroot -p password xhyEnter password: xhy 第二次更改密码&#xff1a; mysqladmin -uroot -pxhy password xhy1mysql -u root -p En…

python列表统计每个元素出现次数_python 统计list中各个元素出现的次数的几种方法...

利用字典dict来完成统计举例&#xff1a;a [1, 2, 3, 1, 1, 2]dict {}for key in a:dict[key] dict.get(key, 0) 1print dict输出结果&#xff1a;>>>{1: 3, 2: 2, 3: 1}利用Python的collection包下Counter的类举例&#xff1a;from collections import Countera …

freeBSD的vi

vi 的两种命令模式&#xff1b; Command&#xff08;命令&#xff09;模式&#xff0c;用于输入命令&#xff1b; Insert&#xff08;插入&#xff09;模式&#xff0c;用于插入文本&#xff1b; Visual&#xff08;可视&#xff09;模式&#xff0c;用于视化的的高亮并选定正文…

raid5需要几块硬盘_Raid5磁盘阵列数据恢复思路分析--附真实案例

1.raid5磁盘阵列数据恢复思路分析Raid5磁盘阵列是一种相对安全的磁盘阵列形式&#xff0c;数据分布状态有点类似于raid0磁盘阵列。但是raid5阵列比raid0阵列更为安全的一点就是阵列的每一组平行数据块中都包含了一个校验块&#xff0c;校验块的作用主要表现在阵列有一块硬盘掉线…