5

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

4 回答 4

5

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

于 2009-11-06T06:08:21.393 回答
4

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

line.decode('ascii')

对于实际上不是 ASCII 编码的数据,这将引发错误。这是忽略这些错误的方法:

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

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

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

于 2009-11-06T06:17:55.403 回答
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)
于 2009-11-06T11:02:05.180 回答
0

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

line = line.decode('latin1')

用正确的编码替换“latin1”。

于 2009-11-06T06:04:09.160 回答