如何使用python删除扩展的ascii?

时间:2009-11-06 05:54:07

标签: python ascii extended-ascii

在尝试修复PML(Palm Markup Language)文件时,看起来好像我的测试文件中有非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 个答案:

答案 0 :(得分:5)

尝试print line.decode('iso-8859-1').encode('ascii', 'ignore') - 这应该更接近你想要的。

答案 1 :(得分:5)

您希望将line视为ASCII编码数据,因此答案是使用ascii编解码器将其解码为文本:

line.decode('ascii')

这会增加实际上不是ASCII编码的数据的错误。这是如何忽略这些错误:

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

这会以unicode实例的形式为您提供文本。如果您更愿意使用(ascii编码的)数据而不是文本,您可以重新编码它以获取strbytes实例(取决于您的Python版本):

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

答案 2 :(得分: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)

答案 3 :(得分:0)

从Python中读取文件时,你会得到字节字符串,在Python 2.x及更早版本中也称为“str”。您需要使用decode方法将这些转换为“unicode”类型。例如:

line = line.decode('latin1')

用正确的编码替换'latin1'。