web-dev-qa-db-ja.com

文字列からすべての非UTF-8シンボルを削除します

大量のファイルとパーサーがあります。私がしなければならないのは、すべての非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の有効な文字列の定義について同意しません。

38
Darth Kotik

最後の2行ではなく、次のコード行を試してください。それが役に立てば幸い:

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

python 3の場合、このスレッドのコメントで述べたように、次のことができます。

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

'ignore'パラメーターは、文字をデコードできない場合にエラーが発生するのを防ぎます。

あなたの行がすでにバイトオブジェクトである場合(例えば_b'my string'_)、あなたはそれをdecode('utf-8', 'ignore')でデコードする必要があります。

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

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)
2
Shafiq