Как мне вставить / получить файлы.mat( matlab) из базы данных postgres в python?
Посмотрев вокруг, я написал этот код вставки / извлечения для чтения в файле.mat, отправил его в столбец базы данных bytea postgres, а затем попытался извлечь его и воссоздать файл.
Я использую psycopg2 для взаимодействия с базой данных.
Вставка:
full_file_path = os.path.join( folder_path, single_file )
f = open(full_file_path,'rb')
file_data = psycopg2.Binary( f.read() )
cur.execute( "INSERT INTO file_data_table "
"( id, file_name, file_data, insertion_date) "
"VALUES ( DEFAULT, %s, %s, %s)",
(single_file, file_data, timestamp))
f.close()
conn.commit()
print single_file + " inserted"
Попытка извлечь и сохранить его в файл (имя_файла - "что-то.mat")
cur = conn.cursor()
cur.execute( "SELECT encode( file_data, 'hex' ), file_name FROM file_data_table")
result = cur.fetchall()
print result[0][0]
for row in result:
print row[1]
full_file_path = os.path.join(folder_path, row[1])
f = open(full_file_path,'w')
f.write(row[0])
f.close()
Он извлекает данные из базы данных и успешно сохраняет их в файле, но файл не открывается как файл формата mat, а размер файла намного больше (примерно в два раза больше), чем исходный файл, который я пытался сохранить в базе данных.,
Я предполагаю, что происходит какое-то преобразование данных, которое я не обрабатываю должным образом.
Любая помощь очень ценится.
1 ответ
Используя подсказку Джоша Купершмидта, я понял, что случилось.
Удаление кодирования и преобразование извлеченного буфера в строку, похоже, теперь работает.
cur = conn.cursor()
cur.execute( "SELECT file_data, file_name FROM file_data_table")
result = cur.fetchall()
print result[0][0]
for row in result:
print row[1]
full_file_path = os.path.join(folder_path, row[1])
f = open(full_file_path,'w')
f.write(str(row[0]))
f.close()