13

私は現在、自分の目的のためにsqliteデータベースにファイル名を保持しています。特殊文字(éなど)を含むファイルを挿入しようとすると、次のエラーがスローされます。

pysqlite2.dbapi2.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

pysqliteに送信された値を次のようなUnicodeメソッドでラップして、「アプリケーションをUnicode文字列に切り替える」と、次のunicode(filename)エラーがスローされます。

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

これを取り除くために私にできることはありますか?準拠するようにすべてのファイルを変更することはできません。

UPDATE を介してテキストをデコードすると、filename.decode("utf-8")上記のProgrammingErrorが発生します。

私の実際のコードは次のようになります。

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [filename.decode("utf-8")])

ここでの私のコードはどのように見えるべきですか?

4

5 に答える 5

14

filenameUnicodeに変換するためのエンコーディングを指定する必要があります。次に例を示しますfilename.decode('utf-8')。使用するだけunicode(...)でコンソールエンコーディングが選択されますが、これは信頼性が低いことがよくあります(多くの場合ascii)。

于 2010-05-14T22:47:09.163 に答える
3

SQLステートメントの引数をUnicodeとして渡す必要があります。

さて、それはすべて、ファイル名リストを取得する方法に依存します。おそらく、またはを使用してファイルシステムを読んでいますos.listdiros.walk?その場合、次のいずれかの関数にUnicode引数を渡すだけで、ファイル名をUnicodeとして直接取得する方法があります。
例:

  • os.listdir(u'.')
  • os.walk(u'.')

もちろん、u'.'ディレクトリを、内容を読んでいる実際のディレクトリに置き換えることができます。Unicode文字列であることを確認してください。

于 2010-06-10T13:43:37.353 に答える
1

Unicode文字列を直接渡そうとしましたか?

cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))

スクリプトの最初にファイルエンコーディングを追加する必要があります。

# coding: utf-8
于 2010-05-15T00:25:38.647 に答える
1

あなたはすでにこれを理解しました、しかし:

質問が現在述べているように、cursor.execute( "select * from musiclibrary where Absolutepath =?;"、[filename.decode( "utf-8")])からProgrammingError例外を実際に取得できるとは思いません。

utf-8デコードが爆発するか、cursor.execute呼び出しが結果に満足します。

于 2011-01-11T05:23:00.380 に答える
-1

これに変更してみてください:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [unicode(filename,'utf8')])

でエンコードしないファイル名の起点で、エンコードutf8に変更utf8します。

于 2017-08-19T03:19:43.573 に答える