2010-09-14 201 views
21

我有一個名爲「客戶」的Sqlite 3和/或MySQL表..如何在Python中使用數據庫創建CSV文件?

使用python 2.6,如何創建一個名爲Clients100914.csv頭文件的csv文件? 擅長方言......

在SQL執行:SELECT *只給表中的數據,但我想完整的表頭。

如何創建設置讓表頭的記錄。表頭應該直接來自沒有用python編寫的sql。

w = csv.writer(open(Fn,'wb'),dialect='excel') 
#w.writelines("header_row") 
#Fetch into sqld 
w.writerows(sqld) 

此代碼留給我的文件打開,沒有標題。也不能弄清楚如何使用文件作爲日誌。

+0

你想要的表放入該文件的內容? – SilentGhost 2010-09-14 15:18:59

+2

使用'csv'模塊有什麼問題? – 2010-09-14 15:21:52

+0

我需要包含日期的所有表格內容。 – Merlin 2010-09-14 15:25:43

回答

45
import csv 
import sqlite3 

from glob import glob; from os.path import expanduser 
conn = sqlite3.connect(# open "places.sqlite" from one of the Firefox profiles 
    glob(expanduser('~/.mozilla/firefox/*/places.sqlite'))[0] 
) 
cursor = conn.cursor() 
cursor.execute("select * from moz_places;") 
#with open("out.csv", "w", newline='') as csv_file: # Python 3 version  
with open("out.csv", "wb") as csv_file:    # Python 2 version 
    csv_writer = csv.writer(csv_file) 
    csv_writer.writerow([i[0] for i in cursor.description]) # write headers 
    csv_writer.writerows(cursor) 

PEP 249 (DB API 2.0)有大約cursor.description的更多信息。

+0

好的,代碼看起來更容易理解和維護,它對於MySql和Sybase來說是一樣的,如果chg連接字符串? – Merlin 2010-09-22 16:12:05

+2

用於光標中的行: csv_writer.writerow(row) > csv_writer.writerows(row) – Merlin 2010-09-22 16:29:13

+0

@ user428862:代碼還應該可以在MySQL或Sybase數據庫中使用。我已經用你的建議更新了答案。 – 2010-09-22 19:01:34

4

您可以輕鬆地手動創建,寫入文件有選擇的分隔符。您也可以使用csv module

如果從數據庫是你可以ALO只使用一個查詢從SQLite的客戶端:

sqlite <db params> <queryfile.sql> output.csv 

,這將創造與標籤分離器csv文件。

+1

當然,命令'.separator'可以在命令中使用sqlite來使csv文件使用逗號分隔符 – 2010-09-15 00:48:25

+1

它是否在數據中跳過分隔符? – 2010-09-22 01:24:45

0

除非我失去了一些東西,你只是想做一些事情是這樣的...

f = open("somefile.csv") 
f.writelines("header_row") 

邏輯寫行到文件(您可能需要組織的價值觀和添加通訊科或管道等。 )

f.close() 
+0

雖然Guillaume的答案更直接。 – 2010-09-14 15:24:15

+0

我需要pyodbc模塊,所以我可以在以後使用mysql。 – Merlin 2010-09-14 15:30:34

8

使用csv module非常簡單直接,並且是爲此任務完成的。

import csv 
writer = csv.writer(open("out.csv", 'w')) 
writer.writerow(['name', 'address', 'phone', 'etc']) 
writer.writerow(['bob', '2 main st', '703', 'yada']) 
writer.writerow(['mary', '3 main st', '704', 'yada']) 

創建完全符合您期望的格式。

+0

謝謝,do我需要定義每一行HT我需要創建文件的日期,創建標題行,選擇*,然後將選擇*插入CSV。 – Merlin 2010-09-14 15:32:35

+2

它不會以編程方式編寫表頭。 – Merlin 2010-09-17 02:57:54

2

如何從現有表中提取的列標題:

您不需要解析SQL「CREATE TABLE」語句。這是幸​​運的,因爲「CREATE TABLE」語法既不漂亮也不乾淨,這是疣豬醜陋。

可以使用table_info編譯。它爲您提供有關表格中每個列的有用信息,包括列的名稱。

例子:

>>> #coding: ascii 
... import sqlite3 
>>> 
>>> def get_col_names(cursor, table_name): 
...  results = cursor.execute("PRAGMA table_info(%s);" % table_name) 
...  return [row[1] for row in results] 
... 
>>> def wrong_way(cur, table): 
...  import re 
...  cur.execute("SELECT sql FROM sqlite_master WHERE name=?;", (table,)) 
...  sql = cur.fetchone()[0] 
...  column_defs = re.findall("[(](.*)[)]", sql)[0] 
...  first_words = (line.split()[0].strip() for line in column_defs.split(',')) 
...  columns = [word for word in first_words if word.upper() != "CONSTRAINT"] 
...  return columns 
... 
>>> conn = sqlite3.connect(":memory:") 
>>> curs = conn.cursor() 
>>> _ignored = curs.execute(
...  "create table foo (id integer, name text, [haha gotcha] text);" 
... ) 
>>> print get_col_names(curs, "foo") 
[u'id', u'name', u'haha gotcha'] 
>>> print wrong_way(curs, "foo") 
[u'id', u'name', u'[haha'] <<<<<===== WHOOPS! 
>>> 

與現在刪除的其他問題 「解析創建表的SQL」 的答案:

  1. 東西瞭如create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ...不僅需要忽略CONSTRAINT,還需要關鍵字PRIMARY,UNIQUE,CHECKFOREIGN(請參閱create table文檔)。

  2. 時,需要在指定re.DOTALL有在SQL換行。

  3. line.split()[0].strip()strip是多餘的。

+0

謝謝,約翰....在下面的代碼中,我不得不只添加兩行到現有的代碼...去Python! – Merlin 2010-09-22 16:28:00

0

你似乎熟悉Excel和想留接近它。我可能會建議嘗試PyExcelerator

+5

Clippy是你嗎?^_- – 2010-09-22 03:36:04

+0

-1 pyExcelerator是棄用軟件。改用xlwt(http://www.python-excel.org)。這是pyExcelerator的一個分支,它有bug修復和一些增強功能。 [Dis] claimer:我是維護者。 – 2010-09-22 04:29:15

+0

我知道excel/VBA,但離開MSFT和Windows。 – Merlin 2010-09-22 16:15:21

0

這很簡單,適合我。

比方說,你已經連接到數據庫表,也得到了光標對象。所以從這一點開始。

import csv 
curs = conn.cursor() 
curs.execute("select * from oders") 
m_dict = list(curs.fetchall()) 

with open("mycsvfile.csv", "wb") as f: 
    w = csv.DictWriter(f, m_dict[0].keys()) 
    w.writerow(dict((fn,fn) for fn in m_dict[0].keys())) 
    w.writerows(m_dict) 
相關問題