如何使用python删除扩展ascii?

2024-05-29 07:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在尝试修复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

目前还不太清楚如何正确地传递要处理的行。


Tags: 文件in标记import语言forlineascii
3条回答

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

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

line.decode('ascii')

这将对实际上不是ASCII编码的数据产生错误。以下是忽略这些错误的方法:

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

这将以unicode实例的形式提供文本。如果您希望使用(ascii编码的)数据而不是文本,则可以对其重新编码以返回strbytes实例(取决于您的Python版本):

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

要删除非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)

相关问题 更多 >

    热门问题