从文件文本中删除非ASCII字符

3

Python专家:

我有一个句子,像这样: "this time air\u00e6\u00e3o was filled\u00e3o" 我希望删除非ASCII的Unicode字符。 我可以使用以下代码和函数:

def remove_non_ascii(text): return ''.join(i for i in text if ord(i) < 128)
def removeNonAscii(s): 
    return "".join(filter(lambda x: ord(x)<128, s))          

sentence = "this time air\u00e6\u00e3o was filled\u00e3o"   
sentence = removeNonAscii(sentence)
print(sentence)

接着它会显示:"this time airo was filledo",很好地去除了"\00..",但是当我把这句话写入文件中,然后读取并作为一个循环时:

def removeNonAscii(s):
    return "".join(filter(lambda x: ord(x)<128, s))

hand = open('test.txt')
for sentence in hand:
    sentence = removeNonAscii(sentence)
    print(sentence)

这里显示"this time air\u00e6\u00e3o was filled\u00a3o",但它根本不起作用。发生了什么?如果函数正常工作,就不应该出现这种情况...


3
文件中到底有什么内容?例如,文件是否实际上包含"\u00e6"作为6个分离的(ASCII码点)字节,而不是Unicode字符0xe6的UTF-8序列? - Tom Dalton
@Hsiang,你代码中的\u00e6(一个字符串字面量)与它在文件中的表现非常不同。尝试将该句子写入文件,然后在代码中读取:open('test.txt', 'w').write("air\u00e6\u00e3o") 或类似的操作。 - Nick T
我刚刚将Python升级到3.4.3版本。我正在使用Jupyter。这可能是原因吗? - TripleH
@Nick,谢谢。你的意思是我按照你建议的打开文件并写入,像这样:open('test.txt', 'w').write("air\u00e6\u00e3o") 是的,文本内容显示为“airæão”。 - TripleH
@Nick:我想你是指 codecs.open() - martineau
显示剩余11条评论
1个回答

2
我有一种感觉,你的文件中实际上并没有使用真正的非 ASCII 字符,而是显示了该字符的 UTF-8 序列,也就是说,它实际上是代码 \u00--,所以当你运行代码时,它会读取每个字符并发现它们完全正常,因此过滤器留下了这些字符。
如果是这种情况,请使用以下方法:
import re
def removeNonAscii(s):
    return re.sub(r'\\u\w{4}','',s)

同时将删除所有 '\u----' 的实例。

示例:

>>> with open(r'C:\Users\...\file.txt','r') as f:
    for line in f:
        print(re.sub(r'\\u\w{4}','',line))
this time airo was filledo

需要翻译的内容:

其中 file.txt 包含以下内容:

this time air\u00e6\u00e3o was filled\u00a3o


它有效!谢谢!它适用于所有类型的非ASCII字符吗? - TripleH
1
@Hsiang,文件中没有任何非ASCII字符,否则一开始就不会起作用。该文件按顺序包含文字字符“\”,“u”,“0”,“0”,“e”和“6”。而不是单个字节的“\u00e6”。 - Adam Smith
这并不是替换非ASCII字符,而是替换任何看起来像Unicode字符的UTF-8表示形式。实际上,这些是6个单独的字符。 - R Nar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接