0

我是 python 新手,正在寻找一种执行“复杂”任务的方法。

我需要将小图像(每个小于 1mb)存储到Image我的数据库的列(blob)中。我的脚本当前检索读取文件所需的 URL。到目前为止,我还没有找到方法来检索图像并将它们上传到数据库而不将它们写入 HDD(以节省 HDD)。

我目前正在使用 URLlib2 和 MySQL 连接器,如果可能的话,我想继续使用它们,因为它们可以在 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:我知道将图像存储在数据库中并不是最好的解决方案,但是由于数据库是跨设备同步的,并且有些可能需要离线数据访问,所以这些图像需要存储在那里。

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))

看看像你这样的其他问题

高温高压

于 2013-06-23T16:25:10.937 回答