2010-09-14 196 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) 
相关问题