Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python删除扩展ascii?_Python_Ascii_Extended Ascii - Fatal编程技术网

如何使用python删除扩展ascii?

如何使用python删除扩展ascii?,python,ascii,extended-ascii,Python,Ascii,Extended Ascii,在尝试修复PML(Palm标记语言)文件时,我的测试文件似乎包含非ASCII字符,这导致MakeBook抱怨。解决方案是去掉PML中的所有非ASCII字符 因此,在尝试用python修复此问题时,我 import unicodedata, fileinput for line in fileinput.input(): print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 但是,这会导致一个错误,即行必须

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

不太确定如何正确地传递要在此时处理的行

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

line = line.decode('latin1')

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

尝试
打印行。解码('iso-8859-1')。编码('ascii','ignore')
——这应该更接近您想要的内容。

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

line.decode('ascii')

这将为事实上不是ASCII编码的数据引发错误。以下是如何忽略这些错误:

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

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


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

要删除非ascii字符,请使用
line.decode(您的\u文件\u编码)。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\t混乱且经常具有破坏性的愤怒\U2020。\U2020。\U2020。\t

使用正则表达式删除非ASCII字符和控制字符也很容易(转义后可以安全使用):


是否要过滤掉ASCII值大于255的任何字符?严格来说,没有扩展ASCII。ASCII定义从0到127的值。任何比这更高的东西都只能被任意解释。也许您应该使用术语非ASCII字符。相关:终端输出的安全转义函数这似乎有效,尽管MakeBook现在抱怨非法控制代码。@Jauder,您当然也可以删除控制代码,例如在上述
clean=''之后。join(如果ord(c)>=32,则c代表c)
(删除所有控制代码,包括换行符和回车符——根据口味调整,我们不能在不知道您要删除哪些控制代码的情况下为您执行此操作!-)。@Alex,如果我知道,我会=)。问题是,我使用的只是一个Java程序,没有可用的源代码,只会发出一条隐晦的错误消息。但理想情况下,我希望删除虚假的控制代码,但保留LF/CR.@Jauder,很好,但我不知道哪些代码是“虚假的”。关于:
spurouse=set(chr(c)表示范围(32)中的c))-set('\r\n\t')
当然还有
clean-''。如果c不在spurouse中,则连接(c表示c),然后通过经验尝试交互式地调整
spurouse
,直到它正是您需要删除的字符集。
regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]')
regexp.sub('', line)