Python编码问题总结

Abaqus GUI程序开发之常用控件使用方法(二十六):表格控件AFXTable使用方法 这个表格内容比较多,之前一直有些逃避,现在学完了其他控件,决定回来补一下。 一、创建表格控件 1.1 基本语法 AFXTable(p,numVisRows,numVisColumns,numRows,numColumns, tgt=None, sel=0, opts=AFXTABLE_NORMAL,X=0, y=0, w=0, h=0, pl=4, pr=4, pt=DEFAULT_MARGIN,pb=DEFAULT_MARGIN) ... 阅读详情

关于文件开头的"编码指示",也就是 # -*- coding: -*- 这个语句。Python 默认脚本文件都是 ANSCII 编码的,当文件 
中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。

关于 sys.defaultencoding,这个在解码没有明确指明解码方式的时候使用。比如我有如下代码:

#! /usr/bin/env python 
# -*- coding: utf-8 -*-

s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode 
s.encode('gb18030')

这句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为 s 本身就是 str 类型的,因此 
Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方 
式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是 
ANSCII,如果 s 不是这个类型就会出错。 
拿上面的情况来说,我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所 
以出错了: 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
0: ordinal not in range(128) 
对于这种情况,我们有两种方法来改正错误: 
一是明确的指示出 s 的编码方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*-

s = '中文' 
s.decode('utf-8').encode('gb18030')


二是更改 sys.defaultencoding 为文件的编码方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*-

import sys 
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 
sys.setdefaultencoding('utf-8')

str = '中文' 
str.encode('gb18030')

///////////////////////////////////////////////////////////////////////////////////

1. pyhton的所有内置库、方法接受的是unicode编码的字符串。

难道os不属于内置库?内置库如何理解


  1. #coding:utf-8    
  2. #指定本文件编码为utf8  
  3. import os  
  4. # 以下为示例代码,不一定能运行。随意写的,无编译运行过。  
  5. # 例子以XP平台为例,因为linux平台编码(UTF-8)与window平台(GBK)不一样。  
  6. # 假设D盘下面有很多中文名称文件  
  7. filelist = os.listdir(r"d:\\") # 此处返回的list中的中文是以GBK编码的,你可以通过查看cmd窗口属性看到。  
  8. for path in filelist:  
  9.     if os.path.isdir(path): continue  
  10.      fp = open(path.decode("GBK") , 'rb')  # 如果此处用 path.decode("UTF-8") 就会抛异常,原因是wind的dir命令返回的是GBK编码  
  11.     print len(fp.read())  
  12.      fp.close()  
  13. filepath =r"d:\\中文文件.doc"             # 假设此文存在,记得要带中文  
  14. fp = open(filepath.decode('utf-8'), "rb") #这里使用utf8参数进行解码,原因是文件头里有句coding: utf-8  
  15. print len(fp.read())  
  16. fp.close()  
  17. path2 = u"d:\\中文文件.doc"  # 假如这里有个u在前面,这个变量就是unicode编码了,不用解码。  
  18. fp = open(path2, 'rb')  
  19. print len(fp.read())  
  20. fp.close()  

////////////////////////////////////////////////////////////////

对于python的unicode变量,使用print输出的话,会使用sys.getfilesystemencoding()返回的编码,把它变成str

解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递,就又需要一次编码过程。

"它们如果确实是一段“文本”,比如你想print出来看看。那么你必须知道它们的编码。然后decode成unicode。" 
这里的加引号的"文本",其实还是字节流(bytes),而不是真正的文本(unicode),只是说明我们知道他是可以解码成文本的. 


如果字符串是这样定义:s=u'中文'

则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。


/////////////////////////////////////////////////////////////////

2.2. 字符编码声明

源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:

?
1
#-*- coding: UTF-8 -*-

实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。参见http://docs.python.org/library/codecs.html#standard-encodings。

另外需要注意的是声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常。现在的IDE一般会自动处理这种情况,改变声明后同时换成声明的编码保存,但文本编辑器控们需要小心 :)

2.3. 读写文件

内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# coding: UTF-8
 
f =  open ( 'test.txt' )
s =  f.read()
f.close()
print  type (s) # <type 'str'>
# 已知是GBK编码,解码成unicode
u =  s.decode( 'GBK' )
 
f =  open ( 'test.txt' , 'w' )
# 编码成UTF-8编码的str
s =  u.encode( 'UTF-8' )
f.write(s)
f.close()

另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# coding: GBK
 
import  codecs
 
f =  codecs. open ( 'test.txt' , encoding = 'UTF-8' )
u =  f.read()
f.close()
print  type (u) # <type 'unicode'>
 
f =  codecs. open ( 'test.txt' , 'a' , encoding = 'UTF-8' )
# 写入unicode
f.write(u)
 
# 写入str,自动进行解码编码操作
# GBK编码的str
s =  '汉'
print  repr (s) # '\xba\xba'
# 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入
f.write(s)
f.close()

2.4. 与编码相关的方法

sys/locale模块中提供了一些获取当前环境下的默认编码的方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# coding:gbk
 
import  sys
import  locale
 
def  p(f):
     print  '%s.%s(): %s'  %  (f.__module__, f.__name__, f())
 
# 返回当前系统所使用的默认字符编码
p(sys.getdefaultencoding)
 
# 返回用于转换Unicode文件名至系统文件名所使用的编码
p(sys.getfilesystemencoding)
 
# 获取默认的区域设置并返回元祖(语言, 编码)
p(locale.getdefaultlocale)
 
# 返回用户设定的文本数据编码
# 文档提到this function only returns a guess
p(locale.getpreferredencoding)
 
# \xba\xba是'汉'的GBK编码
# mbcs是不推荐使用的编码,这里仅作测试表明为什么不应该用
print  r "'\xba\xba'.decode('mbcs'):" , repr ( '\xba\xba' .decode( 'mbcs' ))
 
#在笔者的Windows上的结果(区域设置为中文(简体, 中国))
#sys.getdefaultencoding(): gbk
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp936')
#locale.getpreferredencoding(): cp936
#'\xba\xba'.decode('mbcs'): u'\u6c49'

3.一些建议

3.1. 使用字符编码声明,并且同一工程中的所有源代码文件使用相同的字符编码声明。

这点是一定要做到的。

3.2. 抛弃str,全部使用unicode。

按引号前先按一下u最初做起来确实很不习惯而且经常会忘记再跑回去补,但如果这么做可以减少90%的编码问题。如果编码困扰不严重,可以不参考此条。

3.3. 使用codecs.open()替代内置的open()。

如果编码困扰不严重,可以不参考此条。

3.4. 绝对需要避免使用的字符编码:MBCS/DBCS和UTF-16。

这里说的MBCS不是指GBK什么的都不能用,而是不要使用Python里名为'MBCS'的编码,除非程序完全不移植。

Python中编码'MBCS'与'DBCS'是同义词,指当前Windows环境中MBCS指代的编码。Linux的Python实现中没有这种编码,所以一旦移植到Linux一定会出现异常!另外,只要设定的Windows系统区域不同,MBCS指代的编码也是不一样的。分别设定不同的区域运行2.4小节中的代码的结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#中文(简体, 中国)
#sys.getdefaultencoding(): gbk
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp936')
#locale.getpreferredencoding(): cp936
#'\xba\xba'.decode('mbcs'): u'\u6c49'
 
#英语(美国)
#sys.getdefaultencoding(): UTF-8
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp1252')
#locale.getpreferredencoding(): cp1252
#'\xba\xba'.decode('mbcs'): u'\xba\xba'
 
#德语(德国)
#sys.getdefaultencoding(): gbk
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp1252')
#locale.getpreferredencoding(): cp1252
#'\xba\xba'.decode('mbcs'): u'\xba\xba'
 
#日语(日本)
#sys.getdefaultencoding(): gbk
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp932')
#locale.getpreferredencoding(): cp932
#'\xba\xba'.decode('mbcs'): u'\uff7a\uff7a'

可见,更改区域后,使用mbcs解码得到了不正确的结果,所以,当我们需要使用'GBK'时,应该直接写'GBK',不要写成'MBCS'。

UTF-16同理,虽然绝大多数操作系统中'UTF-16'是'UTF-16-LE'的同义词,但直接写'UTF-16-LE'只是多写3个字符而已,而万一某个操作系统中'UTF-16'变成了'UTF-16-BE'的同义词,就会有错误的结果。实际上,UTF-16用的相当少,但用到的时候还是需要注意。






ABAQUS二次开发-带孔薄板圆角处网格研究 带孔薄板在单向拉力作用下,圆孔上的圆弧各处材料都处于单向受力状态。为方便研究,取四分之一圆弧,其应力分布的理论公式为 σ=σ(1-2cos2θ),应力分布如下图 我们先用ABAQUS建立初始模型,获得rpy程序; 将后缀rpy改成后缀为py,就可以用python进行编辑了 接着删去了不必要的session操作语句; 然后对程序关键部分进行修改; 运行不同网格下的工况,生成曲线。... 阅读详情

相关推荐

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3864

1、悬臂梁脚本文件

1、问题描述: 2、生成viewport,导入响应模块,生成模型数据对象 # -*- coding: mbcs -*- from abaqus import * from abaqusConstants import * session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=309.612487792969, heig...

机器视觉初学者 745

sqoop抽取mysql的数据到hive表里面,字段内容被自动截取,导致字段不全的问题解决

今天央视重新转播NBA,写篇博客纪念一下这个重要的日子,湖人的表现就呵呵了!!!! 强行转到博客的主题来 mysql的字段属性:该字段能存下的值比如:“山东” `province` varchar(3) NOT NULL COMMENT '省份' 用sqoop sqoop import --connect "jdbc:mysql://xxxxxx:3306/xxxxxx?tinyInt1isBit=false&zeroDateTimeBehavior=convertToNull..

放肆桀骜 963

python telnetlib详解 执行循环命令_python执行telnet命令

一个简单的用python执行telnet命令的例子# -*- coding: mbcs -*-import telnetlibimport ipAddressimport syshost='122.224.113.164'port = 20001command='showall'timeout = 2def telnet():global commandtry:tn = telnetlib.Tel...

weixin_39795325的博客 488

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了将YOLOv8模型部署到Hi3516CV610开发板的全流程。内容涵盖从Ubuntu环境搭建、模型获取与验证,到关键的PyTorch模型转换为ONNX格式,并利用海思工具链量化生成板端可执行的.wk文件。最后,指导开发者编写板端C程序,完成视频流处理、NNIE推理及结果后处理,并提供了部署调试与性能优化的实用技巧。

weixin_29215815的博客 268

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

【参数化建模】利用Python在Abaqus里面绘制复杂曲线——以“爱心曲线”为例

【参数化建模】利用Python在Abaqus里面绘制复杂曲线——以“爱心曲线”为例。

know634的博客 1388

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

大华 DSs 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限poc验证是否存在漏洞如果你想查询用户名和密码。

holyxp的博客 4003

Python编码问题

Python编码问题详解 继上一篇文章字符集和编码详解总结了常见字符编码后,这篇文章会对python中常见的编码问题进行分析和总结。由于python3.x版本和python2.x版本在字符编码方面有很大差异,所以本文都是以Python2.7.5来分析2.x版本中的字符编码问题。 1.Python编码基础 1.1 str和unicode python中有两种数据模型来支持字符串这种数

__七把刀__ 2603

自抗扰控制(ADRC)理论与工程实践:8.2 模糊ADRC、神经网络ADRC等智能融合变体

智能融合ADRC变体概述 自抗扰控制(ADRC)与智能控制方法(如模糊逻辑、神经网络)的融合,旨在突破传统ADRC在非线性、时变系统中的应用局限。智能融合ADRC主要通过以下方式实现性能提升: 模糊ADRC 参数自整定:利用模糊推理在线调节ADRC带宽参数,实现自适应控制。 非线性反馈:用模糊控制器替代线性PD,灵活设计非线性控制策略。 优势:融入专家经验,无需精确模型;局限:依赖规则库设计,稳定性分析困难。 神经网络ADRC 增强ESO:用神经网络学习扰动动态,提高估计精度。

技术工作者 228

倍福EL6002做RS232通信获取称重数据..

本文介绍EL6002模块通过RS232自由口通信协议获取从站数据。具体数据对照说明手册即可。

weixin_41883890的博客 1012

python编码问题怎么解决_python编码问题总结

最近利用python抓取一些网上的数据,遇到了编码的问题。非常头痛,总结一下用到的解决方案。linux中vim下查看文件编码的命令 set fileencodingpython中一个强力的编码检测包 chardet ,使用方法非常简单。linux下利用pip install chardet实现简单安装fencoding输出格式 {'confidence': 0.96630842899499614,...

weixin_39675289的博客 236

百度百科 X-Bk-Token 算法还原

百度百科 X-Bk-Token 算法还原

自成背后的博客 1万+

python 编码问题_Python 编码问题

作为中文用户,初学 Python 最容易碰到的问题估计就是编码问题了。明明英文的都可以用到中文的时候就要出问题,而且出错信息难以理解,想要解决问题又不知道从何开始。幸运的是编码问题通过预防性的措施是很好避免的。下面从几个方面来讲讲 Python 中处理中文及 Unicode 容易碰到的问题。Unicode 编码基础这里非常简单的讲一下编码知识,此部分表述可能不太准确,如果你对 Unicode 更为...

weixin_35742845的博客 222

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python2、python3编码问题的理解

相信大多数人在学习python的过程中,遇到第一个比较棘手的问题就是编码错误,这段时间在学习python,被这个问题困惑了好几个星期了,然后就不断的上网查资料,零零散散的看了挺多了,特此写篇博客整理下,也方便自己日后的学习。由于本人水平有限,难免会出现不足、错误之处,还请批评指正。 1. 浅谈编码 我们都知道,计算机并不认识我们平常使用的字符,字符在计算机中的表示形式是低电平和高电平组成的序列...

weixin_41558411的博客 1380

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一文搞懂python2编码问题

博主在做nlp的时候,涉及到中文处理,经常需要print调试错误信息,但是python2这个print中文是在是太不好用了,几经周折,找到了一个懒人方法。 执行pip install uniout,然后就可以使用啦~~~ import uniout list = ["哈哈哈","嘿嘿嘿"] print list ...

hustanding 810

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python编码问题怎么解决_学习python处理python编码问题

Python基础学习中编码问题,就是为什么在Windows命令窗口打开文本显示的是乱码。碰到班里的睡觉大王个性签名:早中晚三个饱,饭前饭后六个倒如何正确解决Python中的中文编码问题import timeprint u">>>这是一个测试星河滚烫,你是人间理想,世事无常,你是人间琳琅,众人平庸,你是人间星光,万事浮沉,你是人间归途。刚学python,抓中文网页遇到编码的问题,怎么转换其实你可以用...

weixin_39626298的博客 211

python编码格式的问题_python编码问题总结

最近利用python抓取一些网上的数据,遇到了编码的问题。非常头痛,总结一下用到的解决方案。linux中vim下查看文件编码的命令 set fileencodingpython中一个强力的编码检测包 chardet ,使用方法非常简单。linux下利用pip install chardet实现简单安装import chardetf = open('file','r')fencoding=chard...

weixin_39664477的博客 137

python爬虫编码问题_python爬虫编码问题

爬虫,新手很容易遇到编码解码方面的问题。在这里总结下。如果处理不好编码解码的问题,爬虫轻则显示乱码,重则报错UnicodeDecodeError: ‘xxxxxx‘ codec can‘t decode byte 0xc6 in position 1034: invalid continuation byte,这个xxx可能是 ascii utf8 gbk等。大家一定要选个专门的时间学习下这方面...

weixin_33573700的博客 936

python编码格式的问题_Python解析XML是出现编码问题

Python解析XML是出现编码问题在python中遇到编码问题是一个非常痛苦的问题。在使用Python处理XML的问题上,首先遇到的是编码问题。Python并不支持gb2312,所以面对encoding="gb2312"或encoding="utf8"的XML文件会出现错误。Python读取的文件本身的编码也可能导致抛出异常,这种情况下打开文件的时候就需要指定编码。此外就是XML中节点所包含的中...

weixin_39526564的博客 1029

Python 常见编码问题与解决方案

编码问题在 Python 中并不罕见,理解字符编码的基本概念以及如何在不同场景下正确处理编码,是每个开发者必须掌握的技能。通过本文的示例和解决方案,你应该能够应对大多数常见的编码问题,确保你的代码在处理文本数据时不再出错。在 Python 2 中,默认的字符串是字节串,而在 Python 3 中,默认的字符串是 Unicode 字符串。编码错误通常发生在处理文本数据时,尤其是文本文件的读取、写入,或者处理来自不同编码系统的数据时。确保在 Python 3 中,你的字符串数据是 Unicode 编码。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 2588

python编码问题总结

最近利用python抓取一些网上的数据,遇到了编码的问题。非常头痛,总结一下用到的解决方案。 linux中vim下查看文件编码的命令 set fileencoding python中一个强力的编码检测包 chardet ,使用方法非常简单。linux下利用pip install chardet实现简单安装 import chardet...

aai7747的博客 105

python编码问题

原来编码问题也这么有学问的,原来都是一通瞎试猜编码,现在可以参考下此图了

little_python的博客 2万+

关于python3的编码问题

今天写爬虫的时候突然遇到一个编码问题 UnicodeEncodeError: 'gbk' codec can't encode character '\xee' in position 20762: illegal multibyte sequence在我的爬虫代码中,用了decode('utf-8'),但是竟然出现了gbk的编码错误 到网上查了一下资料,原来是因为python的print函数

shyoldman的博客 3352
上一篇: 不用TreeViewer如何实现延迟加载
下一篇: hg clone是啥玩意
backard
博客等级 码龄23年 18粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值