簡體   English   中英

SQLITE3數據庫表以CSV格式導出

[英]SQLITE3 database tables export in CSV

我有一個包含10個表的數據庫:(日期,日,月,年,年,pcp1,pcp2,pcp3,pcp4,pcp5,pcp6),每列都有41年的數據集。 day,month和year列為“ Null”,因為l將在csv文件中導出表后稍后添加它們,並且l做了這部分,但是格式不正確,因為每個列必須分別分開。

這是我的數據庫示例:

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)

這是我的問題的答案,並結合了Jean-FrançoisFabre發布的代碼,感謝他的幫助。

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

在python 2中(newline選項不存在):

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

或使用熊貓。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM