袁绍成的个人博客
字符串遍历的坑(Python)

Python中最让人头疼的就是编码问题了(个人观点),在utf-8编码方式中,一个汉字的长度为3个字节;在gbk中,一个汉字的长度为2个字节。那么我们如何正确的遍历一个既有字母又有汉字的字符串呢?

首先我们以python2.x为例,首先最直接的方法是:

# -*- coding: utf-8 -*-
str = '我是袁绍成abc'
for index in range(len(str)):
    print str[index]

运行结果如下:

�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
a
b
c

没错,一个汉字的长度被拆解成3个长度的字节进行输出。
当然我们可以通过str[0:3]的这种方式来获取单个的汉字,但是很明显这种方式不适合在程序种进行遍历。
所以我决定采用先将utf-8的字符串转变为unicode编码方式,因为在unicode编码方式种一个汉字与一个字母的长度是相同的都是1,由此进行改动后变为了:

# -*- coding: utf-8 -*-
str = '我是袁绍成abc'
str = str.decode('utf-8')
for index in range(len(str)):
    print str[index]

然后我们再来看输出结果

我
是
袁
绍
成
a
b
c

汉字出来了,字母也出来了(^_^),但是很明显换行了。我们使用print '',这种在结尾加上逗号的方式去除换行,结果是:

我 是 袁 绍 成 a b c

结果给我们带来了“惊喜”,喜得是换行去掉了,惊得是空格出来了,真是柳暗花明又一村啊。于是求助百度 And Google找到解决方案:Python2.x 和Python3.x 的print方法是不同的,Python2.x print不用加()可以直接输出,例如print '', Python3.x则需要加括号 print(""),由此可见Python3.x的print是一个方法,而且是有参数的,然后搜索print的方法描述,其中参数sep表示字符串之间的连接符,end表示以什么结尾。如果没有设置参数默认sep=' ',end='n',由于我使用的python2.x的环境,所以我使用引用功能包的方式调用print方法,改动后如下

# -*- coding: utf-8 -*-
str = '我是袁绍成abc'
str = str.decode('utf-8')
for index in range(len(str)):
    print(str[index], sep='', end='')

输出结果

我是袁绍成abc

安排!结果终于把换行和空格都去掉了,如果需要紧跟着换行的话就另起一行并且缩进开头print()即可
除此之外还有一个比较方便的方法:

import sys
...
     sys.stdout.write(str[index])

End

评论

评论已关闭


Title - Artist
0:00
    我的个人主页苏ICP备18010375号-1
    本博客由DigitalOcean提供主机服务
    © 2018 - 2019 袁绍成的个人博客
    博客已经运行了