0

私はpythonが初めてで、「複雑な」タスクを実行する方法を探しています。

小さな画像 (それぞれ 1 MB 未満Image) を DB の列 (blob) に保存する必要があります。私のスクリプトは現在、ファイルの読み取りに必要な URL を取得しています。HDDに書き込むことなく(HDDを節約するために)、画像を取得してDBにアップロードする方法はこれまでのところ見つかりませんでした。

私は現在 URLlib2 と MySQL Connector を使用しています。Windows と Debian の両方で動作するため、可能であれば引き続き使用したいと考えています。

codes = [xx, aa, ab] # This line is simulated as it is gerated by a long script run previously...

print "-> Downloading Flags..."
for code in codes:
    if not code == 'xx':
        filename = "%s-lgflag.gif" % code
        url = "%s%s" % (flagurl, filename)
        index = code.index(code)

        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        infile = opener.open(url)
        pic = infile.read()

        update_time = int(time.time())

        wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic_bin, update_time, names[index], lockid)
        cursor.execute(wquery)
        cnx.commit()
        sys.exit() ### Exit to make sure that I don't pass the whole list of 500+ flags
print "-> Flags downloaded"

このコードはエラーを返します:

Traceback (most recent call last):
  File "C:\Users\***\flagstest.py", line 61, in <module>
    wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic, update_time, names[index], lockid)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc1 in position 41: ordinal not in range(128)

誰かがそれを回避する方法を見つけるのを手伝ってくれることを願っています...

PS: DB に画像を保存することは最善の解決策ではないことは承知していますが、DB はデバイス間で同期され、オフライン データ アクセスが必要な場合があるため、これらの画像をそこに保存する必要があります。

4

1 に答える 1

0

あなたのクエリで:

 wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic_bin, update_time, names[index], lockid)

基本的に、文字列フォーマット システムを使用してバイナリから文字列を作成します。そこで、python は各引数を文字列 (つまりstr(pic_bin)) に変換し、文字列内の一致するものをそれに置き換えよう%sとします。代わりに、カーソルのシステムを使用する必要があります。

wquery = "UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'"
cursor.execute(wquery, (pic_bin, update_time, names[index], lockid))

あなたのような他の質問を見てください

HTH

于 2013-06-23T16:25:10.937 に答える