Python 笔记

By | 2023年6月27日

Ubuntu 源与 Python 版本关系

  • ubuntu18.04 源默认 python3.6
  • ubuntu20.04 源默认 python3.8
  • ubuntu22.04 源默认 python3.10

Python2.7编码基础

在 Python 2.7 中,字符串变量默认使用 str 类型,而不是 unicode 类型。这是 Python 2 和 Python 3 的一个显著区别。网络字节流转换成

str 类型时,Python2.7 并不会自动识别或处理编码。网络字节流在传输时只是字节数据,编码方式由发送方和接收方约定。

encode/decode/unicode/python脚本文件编码

# 字符串通过编码成为字节码
str1 = "张三"
bytes = str1.decode(encoding="utf-8")

# 字节码通过解码成为字符串
str2 = bytes.encode(encoding="utf-8")
print str2

写代码时,在字符串前加 u,表示这是 unicode 字符串(未编码),说的准确点就是字节码,用十六进制表示就是这串 \u674e\u56db

用 unicode 在线解码工具也可以验证这点:

另外,对于 Python2.x 版本开头一般会加 coding: utf-8,表示声明 python 代码的文本格式是 utf-8 编码的,即告诉 python 解释器要按照 utf-8 编码的方式来读取程序,因为在 Python2.x 的版本中,文本默认采用的是 ASCII 编码,而Python3.x 的版本中,默认使用的就是 UTF-8 编码格式,所以就不需要在前面进行声明了。

客户现场多台天融信设备采集乱码问题

采集脚本是 python2.7,通过账号1执行 show running 采集到的配置存于变量 var1,通过账号2执行 firewall policy show 采集到的配置存于变量 var2,两个变量需要合并成一个然后保存到文件系统,但 var1 和 var2 里字符串的编码却不一样,一个是 gb2312,另一个是utf-8。测试第二台时 var1 和 var2 里编码却正好相反,没有任何规律。解决办法是先后尝试decode gb2312和utf-8(如:var1.decode(‘gb2312’) 和 var2.decode(‘utf-8’))到unicode ,只要其中一个 decode 不报错说明就是那种编码,var1和var2都是这么处理来统一到 unicode,最后用客户前端UI选择的编码来编码unicode,保存到文件系统。

以上操作后,现场4台设备的采集不再乱码(包括地址对象名等和策略名)。但剩余2台还是出现了乱码,经查问题出在 show running 的 var1变量,它的字符串编码既不是 utf-8,也不是 gb2312,因为 decode都报错。解决办法:var1.decode(‘gb2312′,’ignore’) ,对就是加个 ignore,不幸的是采集后还是乱码,改成 var1.decode(‘utf-8′,’ignore’) 后问题得以解决。为此将自定义采集脚本分成了 topsec-tos-utf8.py 和 topsec-tos-gb2312.py 两个,在变量中有特殊字符导致无法 decode 出编码时,客户只能两个自定义脚本都试一下。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注