2017-06-29 6 views
0

DjangoプロジェクトのMySQLデータベースにインポートしようとしている大きな.csvがあります。私は、行の.CSVをgrepをした後大きなcsvをMySQLに挿入し、不明な文字の行を無視する

django.db.utils.OperationalError: (1300, "Hey! Are you out tonight?") 

:しかし、私は次のエラーを取得しておく

LOAD DATA LOCAL INFILE 'file.csv'... 

:私のような生のSQL文を書くためにdjango.dbライブラリを使用していますエラーがこの文字によって引き起こされていることを認識しました。私はこれを修正した後、他の文字がそのエラーを投げることになるでしょう。

実行中:端末から

$ file --mime file.csv 

は、返されます。私のデシベルの残りの部分はUTF-8である

$ file.csv: text/html; charset=us-ascii 

ので、私はそれを再エンコードするPythonスクリプトを書いてみました、 「無視する」ことを期待し.encode('utf-8', 'ignore')を使用するとのトラブルを与えたが、それは投げた任意のシンボルを削除します:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 825410: invalid continuation byte 

事は、私は実際に私のDBにファイルの100%を挿入する気にしないです。私はちょうど奇妙な文字を含んでいない '安全な'行だけを挿入するだけです。

LOAD DATA LOCAL INFILE SQLステートメントを変更する方法を探していますので、問題を引き起こす行を挿入するのをスキップするだけです。私はデータの前処理に時間を費やしたくないので、これは最適です。

これが実現できない場合は、dbを更新するたびに後で私のdjangoアプリケーションから実行できるPythonスクリプトを使用して、面倒な文字や行を削除することをお勧めします。

それ以外の場合は、UTF-8ではない文字をgrepする方法についての情報が役立ちます。

+0

csvビルトインライブラリ - https://docs.python.org/3/library/csv.htmlを試しましたか? – chachan

+0

csv組み込みライブラリがどのように役立つかを詳しく説明できますか?それは、文字セットを指定するか、データを消去するメソッドを持っていますか? – Sam

+0

答えとして追加 – chachan

答えて

1

これは役立ちますが、これは私が試してみた何であれば100%わからない:

Since open() is used to open a CSV file for reading, the file will by default be decoded into unicode using the system default encoding (see locale.getpreferredencoding()). To decode a file using a different encoding, use the encoding argument of open:

import csv 
with open('some.csv', newline='', encoding='utf-8') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     print(row) 

official docsから集められた例です。ドキュメントのように、utf-8を実際のファイルエンコーディングに置き換える必要があるかもしれないことに注意してください。次に、Pythonを使用してデータをDBにプッシュしたり、新しいエンコーディングで新しいファイルを書き込んだりすることができます。

または、this could could be another approach

2

の場合、MySQLはを、格納先の列のに接続する必要があります。

よりPythonのノート:http://mysql.rjweb.org/doc.php/charcoll#python

E9は意味がありません。 のUTF-8エンコードの16進数はF09F989Cです。

文字間の変換に関するリンクは無関係です。絵文字にはUTF-8のみを使用できます。

+0

うわー、リンクありがとう。非常に有益で、あなたは明らかに非常に知識があります。あなたの最初の文章を明確にするために、私はcsvに 'LOAD DATA LOCAL INFILE file.csv IGNORE INTO TABLE content CHARACTER SET utf8mb4 ...'を読み込んでいます。その後、私のsettings.pyは、DATABASEセクションのために、次のい: ' 'ENGINE': 'django.db.backends.mysql'、 ... 'オプション':{ は、 '文字セット': 'utf8mb4'、 'use_unicode':True、 } ' あなたが話していた接続部分を処理すると信じています。これは正しいのですか、それとも私がやっているべきことがありますか? – Sam

+0

Hehe - 私はそれを偽っている。私は決してPythonでコード化していません。このリンクは、Pythonの文字の問題と35の他の言語の問題の解決策をまとめたものです。そのほとんどは私が触れていないものです。だから、私は本当にあなたの最後の質問に答えることはできません。それが動作するかどうかお知らせください。 (そのリンクでエラーが見つかった場合は教えてください;私はそれを更新します) –

+0

ハハ、素敵です。あなたのブログのDjangoの部分に続いて、さらに私を得ましたが、残念ながらそれは後でいくつかの中国語のcsvで失敗しました。私は文字セットにlatin1を使うために 'LOAD DATA'ステートメントを変更しました。私はこれが私をかむために戻ってくると確信していますが、それは私のdbにcsv全体を取得するために働いた。私はなぜlatin1がutf8mb4がどこで動作しなかったのかは分かりません。 – Sam

関連する問題