我使用psycopg2连接到postgre,并将数据导出到CSV文件中。
我就是这样将DB导出到csv的:
def export_table_to_csv(self, table, csv_path):
sql = "COPY (SELECT * FROM %s) TO STDOUT WITH CSV DELIMITER ','" % table
self.cur.execute(sql)
with open(csv_path, "w") as file:
self.cur.copy_expert(sql, file)但是数据只是行-没有列名的,。
如何使用列名导出数据
P.S.我能打印列名:
sql = '''SELECT * FROM test'''
self.cur.execute(sql)
column_names = [desc[0] for desc in self.cur.description]
for i in column_names:
print(i)我想要最干净的方法来导出带有列名的DB (也就是说,我更喜欢在一种方法中这样做,而不是在回溯中重命名列)。
发布于 2022-01-05 18:51:13
正如我在注释中所说,您可以将HEADER添加到SQL的WITH子句中:
sql = "COPY (SELECT * FROM export_test) TO STDOUT WITH CSV HEADER"默认情况下,逗号分隔符与CSV选项一起使用,因此不需要指定。
对于未来的问题,您应该提交一个minimal reproducible example。也就是说,我们可以直接复制、粘贴和运行代码。我很好奇这个能不能用,所以我做了一个,试了一下:
import psycopg2
conn = psycopg2.connect('host=<host> dbname=<dbname> user=<user>')
cur = conn.cursor()
# create test table
cur.execute('DROP TABLE IF EXISTS export_test')
sql = '''CREATE TABLE export_test
(
id integer,
uname text,
fruit1 text,
fruit2 text,
fruit3 text
)'''
cur.execute(sql)
# insert data into table
sql = '''BEGIN;
insert into export_test
(id, uname, fruit1, fruit2, fruit3)
values(1, 'tom jones', 'apple', 'banana', 'pear');
insert into export_test
(id, uname, fruit1, fruit2, fruit3)
values(2, 'billy idol', 'orange', 'cherry', 'strawberry');
COMMIT;'''
cur.execute(sql)
# export to csv
fid = open('export_test.csv', 'w')
sql = "COPY (SELECT * FROM export_test) TO STDOUT WITH CSV HEADER"
cur.copy_expert(sql, fid)
fid.close()由此产生的文件是:
id,uname,fruit1,fruit2,fruit3
1,tom jones,apple,banana,pear
2,billy idol,orange,cherry,strawberryhttps://stackoverflow.com/questions/70597355
复制相似问题