在尝试修复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
不太确定如何正确传递线路以进行此处理。
答案 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编码的)数据而不是文本,您可以重新编码它以获取str
或bytes
实例(取决于您的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'。