如何在Python中去除扩展ASCII?
我在修复一个PML(Palm标记语言)文件时发现,测试文件里有一些非ASCII字符,这让MakeBook报错。解决办法就是把PML文件里的所有非ASCII字符去掉。
所以我尝试用Python来解决这个问题,我写了以下代码:
import unicodedata, fileinput
for line in fileinput.input():
print unicodedata.normalize('NFKD', line).encode('ascii','ignore')
但是,这样做却出现了一个错误,提示说行必须是“unicode,而不是str”。这是文件的一部分:
\B1a\B \tintense, disordered and often destructive rage†.†.†.\t
我现在不太确定该怎么正确地传递这一行,以便进行处理。
4 个回答
要去掉那些不是ASCII字符的内容,可以使用 line.decode(your_file_encoding).encode('ascii', 'ignore')
这个方法。不过,可能更好的办法是使用PLM转义序列来处理它们:
import re
def escape_unicode(m):
return '\\U%04x' % ord(m.group())
non_ascii = re.compile(u'[\x80-\uFFFF]', re.U)
line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t'
print non_ascii.sub(escape_unicode, line)
这样输出的结果是 \B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\t
。
用正则表达式去掉非ASCII字符和控制字符也很简单(在转义后可以安全使用):
regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]')
regexp.sub('', line)
你想把 line
当作 ASCII 编码的数据来处理,所以你可以用 ASCII 编码来解码它,方法是:
line.decode('ascii')
不过,如果数据不是 ASCII 编码的,这样做会报错。要忽略这些错误,你可以这样做:
line.decode('ascii', 'ignore')
。
这样你就能得到文本,形式是一个 unicode
实例。如果你更想处理(ASCII 编码的)数据而不是文本,你可以重新编码,把它变回 str
或 bytes
实例(这取决于你用的 Python 版本):
line.decode('ascii', 'ignore').encode('ascii')
试试这个代码:print line.decode('iso-8859-1').encode('ascii', 'ignore')
-- 这样应该更接近你想要的结果。