0

周りを見回した後、.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()

データベースからデータを取得し、ファイルに正常に保存しますが、ファイルはマットファイルとして開かれず、ファイルサイズはデータベースに保存しようとした元のファイルよりもはるかに大きくなります (約 2 倍)。 .

適切に処理していないデータ変換が発生していると思います。

どんな援助も大歓迎です。

4

1 に答える 1

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()
于 2015-02-05T17:13:28.513 に答える