У меня есть следующая таблица в SQLite 3, и я планирую использовать ее для хранения различных файлов: txt, pdf, изображений и zip-файлов.
CREATE TABLE zip (filename TEXT PRIMARYKEY NOT NULL, zipfile BLOB NOT NULL);
Для хранения и извлечения я экспериментирую со следующим кодом Python
#!env/bin/python
import sqlite3 as lite
import os
import sys
def insertfile(_filename):
try:
con = lite.connect('histogram.db', detect_types=lite.PARSE_DECLTYPES)
con.row_factory = lite.Row
cur = con.cursor()
cur.execute('PRAGMA foreign_keys=ON;')
_f = open(_filename,'rb')
_split = os.path.split(_filename)
_file = _split[1]
_blob = _f.read()
cur.execute('INSERT INTO zip (filename,zipfile) VALUES (?,?)', (_file,lite.Binary(_blob)))
_f.close()
con.commit()
cur.close()
con.close()
except Exception as ex:
print ex
def getfile(_filename):
try:
con = lite.connect('histogram.db', detect_types=lite.PARSE_DECLTYPES)
con.row_factory = lite.Row
cur = con.cursor()
cur.execute('PRAGMA foreign_keys=ON;')
cur.execute('SELECT zipfile from zip where filename = ?', (_filename,))
_files = cur.fetchall()
if len(_files) > 0:
_file = open('Test/'+ _filename,'wb')
_file.write(_files[0]['zipfile'])
_file.close()
cur.close()
con.close()
except Exception as ex:
print ex
if __name__ == '__main__':
print 'works'
insertfile(sys.argv[1])
getfile(os.path.split(sys.argv[1])[1])
Когда я проверяю это на таких файлах, как .txt
, .py
, .pdf
и т. д., все работает нормально.
С Zip-файлами при сохранении в таблицу нет ошибки, но возникает ошибка при извлечении файла:
Не удалось декодировать столбец UTF-8 "zipfile" с текстом "PK"
Кажется, есть какая-то проблема с кодировкой или декодированием.
detect_types=lite.PARSE_DECLTYPES
пытается преобразовать ваш байт-блоб в строку UTF-8, но терпит неудачу, потому что это недопустимая строка UTF-8? Я бы удалил это и попробовал еще раз. - person Daniel   schedule 12.12.2017