如何从python中的postgres数据库插入/检索.mat(matlab)文件?

时间:2015-02-04 22:06:55

标签: python matlab postgresql bytea

环顾四周之后,我编写了这个插入/检索代码来读取.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"

尝试检索并将其保存到文件(file_name为“something.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 个答案:

答案 0 :(得分:0)

使用Josh Kupershmidt的小费,我弄清楚出了什么问题。

通过删除编码并将检索到的缓冲区转换为字符串,它现在似乎可以正常工作。

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