python 专题十二 字符串 编码

unicode相关

http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue5/unipain.html

基本操作

>>> "中国人"! ! ! ! ! # UTF-8 字符串 (Linux 系统默认)。
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> type(s), len(s)
<type 'str'>, 9
>>> u"中国人"!! ! ! ! # 使用 u 前缀定义 UNICODE 字符串。
u'\u4e2d\u56fd\u4eba'
>>> type(u), len(u)
<type 'unicode'>, 3
>>> "a" + "b"
'ab'
>>> "a" * 3
'aaa'
>>> ",".join(["a", "b", "c"])! ! ! ! ! # 合并多个字符串。
'a,b,c'
>>> "a,b,c".split(",")! ! ! ! ! ! # 按指定字符分割。
['a', 'b', 'c']
>>> "a\nb\r\nc".splitlines()! ! ! ! ! # 按行分割。
['a', 'b', 'c']
>>> "a\nb\r\nc".splitlines(True)!! ! ! ! # 分割后,保留换行符。
['a\n', 'b\r\n', 'c']
>>> "abc".startswith("ab"), "abc".endswith("bc")! ! # 判断是否以特定子串开始或结束。
True, True
>>> "abc".upper(), "Abc".lower()!! ! ! ! # ⼤大小写转换。
'ABC', 'abc'
>>> "abcabc".find("bc"), "abcabc".find("bc", 2)! ! # 可指定查找起始结束位置。
1, 4
>>> " abc".lstrip(), "abc ".rstrip(), " abc ".strip()! # 剔除前后空格。
'abc', 'abc', 'abc'
>>> "abc".strip("ac")! ! ! ! ! ! # 可删除指定的前后缀字符。
'b'
>>> "abcabc".replace("bc", "BC")!! ! ! ! # 可指定替换次数。
'aBCaBC'
>>> "a\tbc".expandtabs(4)!! ! ! ! ! # 将 tab 替换成空格。
'a bc'
>>> "123".ljust(5, '0'), "456".rjust(5, '0'), "abc".center(10, '*')! # 填充
'12300', '00456', '***abc****'
>>> "123".zfill(6), "123456".zfill(4)! ! ! ! ! ! # 数字填充
'000123', '123456'

 

编码

>>> s = "中国人"; s
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> u = s.decode(); u! ! ! # UTF-8 -> UNICODE
u'\u4e2d\u56fd\u4eba'
>>> gb = s.encode("gb2312"); gb! ! # UTF-8 -> GB2312
'\xd6\xd0\xb9\xfa\xc8\xcb'
>>> gb.encode("utf-8")! ! ! # encode 会把 gb 当做默认 UTF-8 编码,所以出错。
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid
continuation byte
>>> gb.decode("gb2312")! ! ! # 可以将其转换成 UNICODE。
u'\u4e2d\u56fd\u4eba'
>>> gb.decode("gb2312").encode()!! # 然后再转换成 UTF-8
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> unicode(gb, "gb2312")!! ! # GB2312 -> UNICODE
u'\u4e2d\u56fd\u4eba'
>>> u.encode()! ! ! ! # UNICODE -> UTF-8
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> u.encode("gb2312")! ! ! # UNICODE -> GB2312
'\xd6\xd0\xb9\xfa\xc8\xcb'
>>> import sys, locale>>> sys.getdefaultencoding()! ! # Python 默认编码。'ascii'
>>> c = locale.getdefaultlocale(); c! # 获取当前系统编码。('zh_CN', 'UTF-8')
>>> reload(sys)! ! ! ! # setdefaultencoding 在被初始化时被 site.py 删掉了。<module 'sys' (built-in)>
>>> sys.setdefaultencoding(c[1])!! # 重新设置默认编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串转换成gb2312编码。  


codecs编码转换,大小端和BOM

>>> from codecs import BOM_UTF32_LE
>>> s = "中国⼈人"
>>> s
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> s.encode("utf-32")
'\xff\xfe\x00\x00-N\x00\x00\xfdV\x00\x00\xbaN\x00\x00'
>>> BOM_UTF32_LE
'\xff\xfe\x00\x00'
>>> s.encode("utf-32").decode("utf-32")
u'\u4e2d\u56fd\u4eba'

格式化

Python 提供了两种字符串格式化方法,除了熟悉的 C 样式外,还有更强大的 format。
%[(key)][flags][width][.precision]typecode
标记:- 左对齐,+ 数字符号,# 进制前缀,或者用空格、0 填充
>>> "%(key)s=%(value)d" % dict(key = "a", value = 10) ! # key
'a=10'
>>> "[%-10s]" % "a"!! ! ! ! ! ! # 左对齐
'[a ]'
>>> "%+d, %+d" % (-10, 10)! ! ! ! ! # 数字符号
'-10, +10'
>>> "%010d" % 3! ! ! ! ! ! ! # 填充
'0000000003'
>>> "%.2f" % 0.1234!! ! ! ! ! ! # ⼩小数位
'0.12'
>>> "%#x, %#X" % (100, 200)! ! ! ! ! # 十六进制、前缀、大小写。
'0x64, 0XC8'
>>> "%s, %r" % (m, m)! ! ! ! ! ! # s: str(); r: repr()
'test..., <__main__.M object at 0x103c4aa10>'

使用format

format 方法支持更多的数据类型,包括列表、字典、对象成员等。
{field!convertflag:formatspec}
格式化规范:
formatspec: [[fill]align][sign][#][0][width][.precision][typecode]
>>> "{key}={value}".format(key="a", value=10)!! # 使用命名参数。
'a=10'
>>> "{0},{1},{0}".format(1, 2)! ! ! ! # field 可多次使用。
'1,2,1'
>>> "{0:,}".format(1234567)! ! ! ! # 千分位符号
'1,234,567'
>>> "{0:,.2f}".format(12345.6789)! ! ! # 千分位,带小数位。
'12,345.68'
>>> "[{0:<10}], [{0:^10}], [{0:*>10}]".format("a")! # 左中右对齐,可指定填充字符。
'[a ], [ a ], [*********a]'
>>> import sys
>>> "{0.platform}".format(sys)! ! ! ! # 成员
'darwin'
>>> "{0[a]}".format(dict(a=10, b=20))! ! ! # 字典
'10'
>>> "{0[5]}".format(range(10))! ! ! ! # 列表
'5'
>>> from string import letters, digits, Template
>>> letters! ! ! ! ! ! ! ! ! # 字⺟母表
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> digits! ! ! ! ! ! ! ! ! # 数字表
'0123456789'
>>> Template("$name, $age").substitute(name = "User1", age = 20)! # 模板替换。
'User1, 20'
>>> Template("${name}, $age").safe_substitute(name = "User1") ! # 没找到值,不会抛出异常。
'User1, $age'

 






你可能感兴趣的:(python)