【问题标题】:SQLITE3 database tables export in CSVSQLITE3 数据库表以 CSV 格式导出
【发布时间】:2016-09-03 14:32:10
【问题描述】:

我有一个包含 10 个表的数据库:(date ,day ,month ,year ,pcp1 ,pcp2 ,pcp3 ,pcp4,pcp5 ,pcp6) 并且每列都有 41 年的数据集。日、月和年列是“Null”,因为我稍后会在导出 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)

【问题讨论】:

    标签: python sqlite csv


    【解决方案1】:

    或者使用熊猫。

    import pandas
    rows = cur.fetchall()
    df = pandas.DataFrame.from_records(rows)
    

    【讨论】:

      【解决方案2】:

      这是我的问题的答案,它结合了 Jean-François Fabre 发布的代码,感谢他的帮助。

      import sys
      import sqlite3
      import csv
      
      conn=sqlite3.connect("pcpnew6.db")
      c=conn.cursor()
      conn.row_factory=sqlite3.Row
      crsr=conn.execute("SELECT * From pcp3")
      row=crsr.fetchone()
      titles=row.keys()
      
      data = c.execute("SELECT * FROM pcp3")
      if sys.version_info < (3,):
          f = open('output.csv', 'wb')
      else:
          f = open('output.csv', 'w', newline="")
      
      writer = csv.writer(f,delimiter=';')
      writer.writerow(titles)  # keys=title you're looking for
      # write the rest
      writer.writerows(data)
      f.close()
      

      这是代码的输出:

      date    day month   year    pcp1    pcp2    pcp3    pcp4    pcp5    pcp6
      1.01.1979               0.431   2.167   9.375   9.375   2.167   0.431
      2.01.1979               1.216   2.583   9.162   9.162   2.583   1.216
      3.01.1979               4.041   9.373   23.169  23.169  9.373   4.041
      4.01.1979               1.799   3.866   8.286   8.286   3.866   1.799
      5.01.1979               0.003   0.051   0.342   0.342   0.051   0.003
      6.01.1979               2.345   3.777   7.483   7.483   3.777   2.345
      

      【讨论】:

      • 我编辑了代码,所以它不会获取第一行,然后是其余的,因为您自己找到了标题,所以没有必要。
      【解决方案3】:
      1. 查询不应该返回标题。我也对以下两点充满信心。这是未经测试的,但description 属性返回最后一个查询表名称,所以它应该可以工作
      2. 关于每行额外的空白行:我想您使用的是 windows。将输出作为文本文件打开,添加一个额外的\r(回车符)。 python 2 和 python 3 的处理方式不同:
      3. 实际上没问题,但您的印象是它不起作用,因为您正在使用 excel 打开 csv,而 excel 默认情况下需要 ; 用于 csvs => 您必须指定分号分隔符,否则 Excel 在其中打开它列。

      查看我的更改:

      在 python 3 中(无法以二进制形式打开文本文件):

          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 兼容 sn-p,带有标题行:

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

      【讨论】:

      • 非常感谢。它有效,但只有“('日期',无,无,无,无,无,无)”这样导出的标题。除了这部分,这是我要找的
      • @ömersarı 我想我找到了添加标题行的方法,请参阅我上次的编辑。
      • 你太棒了!!!我仍然是初学者,但我在这里向像你这样的人学习新事物。非常感谢
      • 所以我认为它有效? (所以我可以更多地改进我的答案)。不用担心,我学习新东西是因为初学者的问题,他们在辅修方面比我了解更多。就是这样!
      • 代码正在运行,但是,“writer.writerow(first_item.keys())”给出错误,如“元组”对象没有属性键()”。没有这部分,写入的数据没有标题. 我尝试了一些东西,但我的知识变得很短,无法处理它。
      猜你喜欢
      • 2013-05-11
      • 2021-08-17
      • 2018-08-08
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多