如何在Python中完全清除字符串中的非法字符?
我有一个程序功能,用户可以上传一个csv文件,我的程序会读取这个文件并用它作为输入。有一个用户抱怨说他的输入出现了错误。这个错误是因为文件里有一个非法字符,编码不正确。这个字符如下:
�
有时候它显示为一个中间有“?”的菱形,有时候是两个菱形中间有“?”,有时候是“\xa0”,还有时候是“\xa0\xa0”。
在我的程序中,如果我这样做:
print str_with_weird_char
这个字符串在我的终端里会显示为菱形“?”代替那个奇怪的字符。如果我把这个字符串复制粘贴到ipython里,它会显示这个信息:
In [1]: g="blah��blah"
WARNING:
********
You or a %run:ed script called sys.stdin.close() or sys.stdout.close()!
Exiting IPython!
注意,菱形“?”现在变成了两个。奇怪的是,复制粘贴后变成了双的……
在django的错误追踪页面上,它看起来是这样的:
UnicodeDecodeError at /chris/import.html
('ascii', 'blah \xa0 BLAH', 14, 15, 'ordinal not in range(128)')
让我困惑的是,我无法对这个字符串做任何操作,否则就会抛出异常。我试过unicode(),试过str(),试过.encode(),试过.encode("utf-8"),无论怎么做都会出错。
我该怎么做才能让这个字符串正常工作呢?
4 个回答
2
你也可以使用:
python3 -c "import urllib, sys ; print urllib.quote_plus(sys.stdin.read())";
这个内容来自 https://wiki.python.org/moin/Powerful%20Python%20One-Liners
** 顺便说一下,网站上提到要使用Python,但我在Python3上测试过,运行得很好
3
在你脚本的第二行声明编码。真的要放在第二行。就像这样:
#!/usr/bin/python
# coding=utf-8
这可能就能单独解决你的问题。如果还不行,可以看看 str.encode('utf-8') 和 str.decode('utf-8')。
12
你可以在使用 .encode 或 .decode 的时候,传入 "ignore" 来跳过那些无效的字符。例如,你可以这样写:"ILLEGAL".decode("utf8","ignore")
>>> "ILLEGA\xa0L".decode("utf8")
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 6: unexpected code byte
>>> "ILLEGA\xa0L".decode("utf8","ignore")
u'ILLEGAL'
>>>