如何在Python中去除扩展ASCII?

5 投票
4 回答
7380 浏览
提问于 2025-04-15 15:43

我在修复一个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 个回答

2

要去掉那些不是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)
4

你想把 line 当作 ASCII 编码的数据来处理,所以你可以用 ASCII 编码来解码它,方法是:

line.decode('ascii')

不过,如果数据不是 ASCII 编码的,这样做会报错。要忽略这些错误,你可以这样做:

line.decode('ascii', 'ignore')

这样你就能得到文本,形式是一个 unicode 实例。如果你更想处理(ASCII 编码的)数据而不是文本,你可以重新编码,把它变回 strbytes 实例(这取决于你用的 Python 版本):

line.decode('ascii', 'ignore').encode('ascii')

5

试试这个代码:print line.decode('iso-8859-1').encode('ascii', 'ignore') -- 这样应该更接近你想要的结果。

撰写回答