2012-01-19 10 views
2

私はcsvファイルをPythonに読み込んでいるので、私は配列として読み込みを保存します。Python:文字列を比較する強力な方法

私はその後、いくつかのOracle DBの結果に対するcsvファイルの結果を比較:

readerSetSAP = [] 
readerSAP = csv.reader(StringIO.StringIO(request.POST['sap'].value),dialect=csv.excel) 
readerSetSAP.extend(readerSAP) 

empsTbl = meta.Session.query(model.Person).all(); 

次に比較するネストされたループを使用します。

if i.userid != currEmp[0].strip(): 
         updated = True 
         print "userid update" 

問題は、私は多くの場合、警告を持って、次のとおりです。

eWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 

私の質問は:

このタイプの文字列をPythonで比較する最も堅牢な方法は何ですか?ここ

+1

あなたはその警告が表示された例を与えることができますか?私の最初の提案は、両方の引数が等しくエンコードされているかどうかを確認する必要があるということです。したがって、入力データをコード化してUnicodeに正しく変換する方法を知る必要があります。 –

+0

あなたはいくつかの関連する手がかりを残しています。どのモジュールをOracleデータベースの読み込みに使用していますか?「meta.Session.query」は何を指していますか?あなたのループコードはIとcurrEmpをどのように設定しますか? currEmp [0]を供給するDBフィールドのタイプは何ですか? –

+0

Pythonでunicodeを理解する方法について、この回答を確認してください。http://stackoverflow.com/a/1818326/244672これが役立つことを願っています。 –

答えて

4

あなたの問題は、「文字列を比較するための確実な方法」ではありませんPythonでstrignsを比較するための確実な方法は、等価演算子==である - 。 あなたの問題はあなたのデータはあなたがされることなく、どこかでUnicodeにcovnertedされていることです

あなたと、コードを書いている人は皆、テキストはASCIIではなく、1990年以降の世界ではないことに注意してください。あなたのアプリケーションはすべて英語に限定されていて、 internatiol環境では、人々の名前や "resumé"のような言葉でASCII以外の文字を見つけることになります。

H EREは、問題が起こる可能性がある場合のPythonのコンソール例です:

>>> "maçã" == u"maçã" 
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
False 

PythonのCSVモジュール(つまり - areadyいくつかのエンコーディングに変換strigns) - 何authomatic変換しないと、バイトstrignsで動作するという結果を意味していますDBからフェッチしているのはUnicodeです。おそらくあなたの接続はデフォルトを使用しています。

これを解決するには、データベースのデータが正しくフォーマットされていること(挿入中に文字情報が失われていないことを前提とする)が、明示的なエンコーディングを使用してCSVファイルから読み取られた文字列をデコードすることです

>>> "maçã".decode("utf-8") == u"maçã" 
True 

だから、あなたがそれを比較する前に、proepr変換を持つためにCSVファイルを形成読んで、文字列の「デコード」メソッドを使用するのです - (Pythonの内部エンコーディングに依存しない)文字列形式ユニコードです。 Windowsの場合は、 "cp1251"を使用してデコードします。他のメインストリーム(アプリケーション)では、O.S。 「utf-8」でなければなりません。

私はこの作品を読むことをお勧めする - それはかなり便利です: http://www.joelonsoftware.com/articles/Unicode.html