删除字符串中的所有非 UTF-8 符号

65 投票
5 回答
133565 浏览
提问于 2025-04-29 10:15

我有很多文件和一个解析器。我需要做的就是去掉所有不是utf-8格式的符号,然后把数据放进mongodb里。

with open(fname, "r") as fp:
    for line in fp:
        line = line.strip()
        line = line.decode('utf-8', 'ignore')
        line = line.encode('utf-8', 'ignore')

不过我还是遇到了一个错误。

bson.errors.InvalidStringData: strings in documents must be valid UTF-8: 
1/b62010montecassianomcir\xe2\x86\x90ta0\xe2\x86\x90008923304320733/290066010401040101506055soccorin

我不太明白。这有没有什么简单的方法可以做到呢?

更新: 看起来Python和Mongo对utf-8有效字符串的定义不太一致。

暂无标签

5 个回答

0

我建议直接用ASCII编码。

line = line.encode('ascii', 'ignore')
0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况很常见,尤其是对于刚开始学习编程的人来说。解决这些问题的第一步就是要理解错误信息,看看它们在告诉我们什么。

通常,错误信息会包含一些提示,帮助我们找到问题所在。比如,它可能会告诉你哪个地方出错了,或者是什么原因导致了错误。理解这些信息就像是在解谜,找到线索,然后一步步解决问题。

另外,很多时候我们可以在网上找到别人遇到类似问题的解决方案,比如在StackOverflow这样的论坛上。这里有很多经验丰富的程序员分享他们的经验和解决办法,帮助我们更快地找到答案。

总之,遇到问题时不要慌张,仔细阅读错误信息,利用网络资源,慢慢就能找到解决办法了。

with open(fname, "r") as fp:
for line in fp:
    line = line.strip()
    line = line.decode('cp1252').encode('utf-8')
8

处理没有UTF-8字符的示例

import string

test=u"\n\n\n\n\n\n\n\n\n\n\n\n\n\nHi <<First Name>>\nthis is filler text \xa325 more filler.\nadditilnal filler.\n\nyet more\xa0still more\xa0filler.\n\n\xa0\n\n\n\n\nmore\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfiller.\x03\n\t\t\t\t\t\t    almost there \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nthe end\n\n\n\n\n\n\n\n\n\n\n\n\n"

print ''.join(x for x in test if x in string.printable)
38

对于Python 3,就像这个讨论中的评论提到的,你可以这样做:

line = bytes(line, 'utf-8').decode('utf-8', 'ignore')

这里的'ignore'参数是用来防止出现错误的,如果有任何字符无法被解码,它就不会报错。

如果你的行已经是一个字节对象(比如说 b'my string'),那么你只需要用 decode('utf-8', 'ignore') 来解码它。

95

试试下面这行代码,替换掉最后两行。希望能帮到你:

line=line.decode('utf-8','ignore').encode("utf-8")

撰写回答