Как мне вставить / получить файлы.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()
Другие вопросы по тегам