我有一个包含10个表的数据库:(日期、日期、月份、年份、pcp1、pcp2、pcp3、pcp4、pcp5、pcp6),每个列都有41年的数据集。日、月和年列为“空”,因为我稍后将在导出csv文件中的表后添加它们,我做了这一部分,但格式不正确,因为每列必须分别独立。
下面是我的数据库示例:
date day month year pcp1 pcp2 pcp3 pcp4 pcp5 pcp6
1.01.1979 0.431 2.167 9.375 9.375 0.431 9.375
2.01.1979 1.216 2.583 9.162 9.162 1.216 9.162
3.01.1979 4.041 9.373 23.169 23.169 4.041 23.169
4.01.1979 1.799 3.866 8.286 8.286 1.799 8.286
5.01.1979 0.003 0.051 0.342 0.342 0.003 0.342
6.01.1979 2.345 3.777 7.483 7.483 2.345 7.483
7.01.1979 0.017 0.031 0.173 0.173 0.017 0.173
我想要上面所有的桌子。但是,我得到了以下输出:
Column 1,Column 2,Ellipsis
1979-01-01,,,,0.431,2.167,9.375,9.375,0.431,9.375
1979-01-02,,,,1.216,2.583,9.162,9.162,1.216,9.162
1979-01-03,,,,4.041,9.373,23.169,23.169,4.041,23.169
1979-01-04,,,,1.799,3.866,8.286,8.286,1.799,8.286
1979-01-05,,,,0.003,0.051,0.342,0.342,0.003,0.342
有几个问题。首先标题不存在,其次跳转另一行(1到3),而不是(1到2),最后所有数据都在column1下汇集在一起。
我的代码是:
import csv
import sqlite3
conn=sqlite3.connect("pcpnew6.db")
c=conn.cursor()
data = c.execute("SELECT * FROM pcp3")
with open('output.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['Column 1', 'Column 2', ...])
writer.writerows(data)
最佳答案
查询不应返回标题。而且我对下面两点都很有信心。这是未经测试的,但是description
属性返回最后一个查询表名,因此它应该可以工作
关于每一行多余的空行:我想你在用windows。将输出作为文本文件打开会添加一个额外的\r
(回车字符)。Python2和Python3的处理方式不同:
它实际上是可以的,但是您会觉得它不起作用,因为您要用excel打开csv,而excel需要一个;
默认情况下,对于csv s=>您必须指定分号分隔符,否则excel会在一列上打开它。
查看我的更改:
在Python3中(无法以二进制方式打开文本文件):
with open('output.csv', 'w', newline="") as f:
writer = csv.writer(f,delimiter=';')
根据文件
writer.writerows(数据)
在Python 2中(新行选项不存在):
with open('output.csv', 'wb') as f:
writer = csv.writer(f,delimiter=';')
writer.writerows(data)
编辑:python 2/3兼容代码段,标题行:
import sys
if sys.version_info < (3,):
f = open('output.csv', 'wb')
else:
f = open('output.csv', 'w', newline="")
writer = csv.writer(f,delimiter=';')
first_item = next(data) # get first item to get keys
writer.writerow(first_item.keys()) # keys=title you're looking for
writer.writerow(first_item)
# write the rest
writer.writerows(data)
f.close()