有些空格处理要注意,python strip函数不起作用的原因。

发表于:
来源:阿酷技术学习
作者:simplefastbest

今天在处理程序时,遇到一个问题:读取一个字符串,用strip()去除首尾空格。

环境是python2,文件编码是utf8

因为字符串保存在字典中,保存是没有用unicode字符串。

直接保存:{'7782':'膨化食品 '}.

for cid,name in leaf.items():
          name=name.strip()

name的空格并没有处理掉。

然而把name.decode('utf8')成unicode字符串以后,再用strip()就会得到正确结果。

我查了一下原因:

1,那就打印一下,看看这个字符串中到底是什么?怎么不能用strip()

name='膨化食品 '
#打印UTF8
print ['%x'%b for b in bytearray(name)]
['e8', '86', 'a8', 'e5', '8c', '96', 'e9', 'a3', '9f', 'e5', '93', '81', 'c2', 'a0']

后面的空格是utf-8编码的双字节16位\xc2\xa0。默认strip()是\x20去除首尾。

2,这个空格是什么?

print [b for b in name]
[u'\u81a8', u'\u5316', u'\u98df', u'\u54c1', u'\xa0']

在utf8下可以看出,后面的空格是u'\xa0',\xa0是一个不间断空白符,在html网页上是 英文名:non-breaking space.

而且我们在处理空格时还要注意还有一个u'\u3000'

我测试了一下:

arr=[u'\u3000',u'\u81a8', u'\u5316', u'\u98df', u'\u54c1', u'\xa0']
print ''.join(arr),type(''.join(arr))
name=''.join(arr)
print [b for b in name]
print [b for b in name.strip()]

 膨化食品 <type 'unicode'>
[u'\u3000', u'\u81a8', u'\u5316', u'\u98df', u'\u54c1', u'\xa0']
[u'\u81a8', u'\u5316', u'\u98df', u'\u54c1']

说明,unicode字符串的时候,strip()还可以去掉u'\u3000'和u'\xa0'

当然这只是去除首尾,需特别的处理。那就需要:

name.strip().replace(u'\u3000', u' ').replace(u'\xa0', u' ')

记住name必须是unicode字符串。