2011-01-13 10 views
6

PythonでHTTP経由でタブ区切りファイルをインポートする作業をしています。PythonからMongoDBへの未知のエンコーディングでファイルをインポートする

行のデータをMongoDBに挿入する前に、文字列からスラッシュ、ティック、引用符を削除します。

データの符号化は、MongoDBのは私に例外をスローしているものは何でも

bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

だから、この問題を解決するための努力で、私は早く私ができるようにしたいやった読書からunicode()関数を使用して、行のデータをUnicodeに変換します。また、私は、最初のパラメータとしてのデコード()関数を渡し、「ユニコード」を呼び出して試してみましたが、エラー受信:私は、このようなスラッシュを置き換えとしての私の文字列操作を行うことができ、そこから

LookupError: unknown encoding: unicode 

を、ダニ、および引用符。その後、データをMongoDBに挿入する前に、str.encode( 'utf-8')関数を使用してUTF-8に変換してください。

問題:Unicodeに変換するときに、私はこのエラーでエラー

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128) 

を受け付けております、私は継続する場所を正確にはわかりません。

私の質問は、ファイルのエンコードを知らなくてもデータを正常にインポートし、UTF-8を必要とするMongoDBに挿入するにはどうすればいいですか?

ありがとうございます!

+0

なぜこれがタグ付けされた "CSV" this articleを読んでみてください! –

+0

しかし、あなたは「HTTPでタブ区切りのファイルをインポートする」と言っています...「CSV」はどこにフィットしていますか? –

答えて

7

ためにこれらを試してみてください:

(0)スラッシュのあなたの除去は、/ etc /ダニいることを確認して、データを解体されていません。ティックは何ですか?あなたのコードを示してください。生データのサンプルを表示してください... print repr(sample_raw data)を使用し、出力をコピーして質問の編集に貼り付けてください。

(1)ファイルのエンコーディングが不明な場合、またはISO-8859-1と指定されている場合はcp1252です...どこから取得していますか?それは他の場所で西ヨーロッパ、アメリカ大陸、または任意のスペイン語を話す/英語/フランス語国/地域から来ていますし、それが有効なUTF-8ではない場合、それは

[編集2]あなたのエラーをCP1252される可能性がありますバイト0x93がU + 201Cにデコードされます。すべてのエンコードcp1250〜cp1258を含むLEFT DOUBLE QUOTATION MARK ...どの言語が書かれたテキストですか? [編集2]

(2)ファイルを保存してから(削除する前に)、ブラウザでファイルを開きます。それは賢明ですか?表示/文字エンコーディングをクリックすると何が表示されますか?

(3)いくつかのより多くの助言とchardet

編集を試してみてください:あなたは(のは、それはCP1252だと仮定します)のエンコーディングが何であるかを知っていたら

(1)入力データを変換しますユニコードに:uc = raw_data.decode('cp1252')

(2)ユニコードとしてデータを処理する(スラッシュ/ティック/スラッシュを除く):clean_uc = manipulate(uc)

(3)あなたはUTF8としてエンコードしてデータを出力する必要があります:to_mongo = clean_uc.encode('utf8')

注1:あなたのエラーメッセージは、「位置1258でバイト0x93をデコードすることはできません」と言う... 1258バイトのかなり長い塊ですテキスト;これは妥当ですか?あなたが不平を言っているデータを見ましたか?どうやって?あなたは何を見たの?

注2:the Python Unicode HOWTO

+0

@ジョシュアバーンズ:答えを受け入れてくれてありがとうが、将来の読者は私が結果が何だったのか疑問に思います... cp1252、あるいは何か? –

+0

@ジョシュアバーンズ:申し訳ありませんが、私は "確かに"理解していません。私はそれがラテン語-1であるとは言いませんでした。私はそれがcp125Xである可能性が高いと言いました。 Latin-1はcp125Xではありません。あなたのエラーバイト0x93は、Latin-1としてデコードされたときに特徴付けられた、実際には見られない、奇妙なものです。 –

+0

ファイルはもともと英語で書かれており、外部ソースから提供されています。私はラインのどこかでデータの一部が壊れていて決して固定されていないと推測しています。 Latin-1としてテキストをエンコードすると、非現実的な文字が表現されていたとしても、このシナリオの問題は解決されました。 –

関連する問題