从字符串中删除每个非 utf-8 符号
Posted
技术标签:
【中文标题】从字符串中删除每个非 utf-8 符号【英文标题】:Delete every non utf-8 symbols from string 【发布时间】:2014-12-19 22:34:05 【问题描述】:我有大量的文件和解析器。我要做的是剥离所有非 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
我不明白。有什么简单的方法吗?
UPD:似乎 Python 和 Mongo 不同意 Utf-8 有效字符串的定义。
【问题讨论】:
在我的头脑中,解析算法不是很重要,终点在前几行。也许我错了 【参考方案1】:with open(fname, "r") as fp:
for line in fp:
line = line.strip()
line = line.decode('cp1252').encode('utf-8')
【讨论】:
如果原始输入编码实际上不是代码页 1252,这将是非常错误的。您删除了错误,但产生了垃圾。该错误是有原因的,以防止您产生垃圾。【参考方案2】:对于 python 3,正如该线程的评论中所述,您可以这样做:
line = bytes(line, 'utf-8').decode('utf-8', 'ignore')
'ignore' 参数可防止在任何字符无法解码时引发错误。
如果您的行已经是字节对象(例如b'my string'
),那么您只需要使用decode('utf-8', 'ignore')
对其进行解码。
【讨论】:
但是如果line
在py3中已经是`str`,是否允许非utf8?【参考方案3】:
不处理 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)
【讨论】:
这会删除所有非 ascii 字符,其中包括许多有效的 UTF-8 字符【参考方案4】:试试下面的代码行而不是最后两行。希望对您有所帮助:
line=line.decode('utf-8','ignore').encode("utf-8")
【讨论】:
我有一些只在插入后才出现的不可见字符。有什么解决办法吗? @user168983 你能举个例子吗 thisline.decode('utf-8','ignore').encode("utf-8")
产生此错误 AttributeError: 'str' object has no attribute 'decode',我使用 python3
@ChediBechikh 这是你在 python3 中的做法bytes(line, 'utf-8').decode('utf-8','ignore')
这似乎不起作用。我得到了很多特殊字符:\00\00\00\00\00
以上是关于从字符串中删除每个非 utf-8 符号的主要内容,如果未能解决你的问题,请参考以下文章