如何在Python中从数据库创建CSV文件?

时间:2010-09-14 15:15:12

标签: python mysql sqlite file-io csv

我有一个名为“clients”的Sqlite 3和/或MySQL表..

使用python 2.6,如何使用标题创建名为Clients100914.csv的csv文件? excel方言......

Sql执行:select *只提供表数据,但我想要带有标题的完整表。

如何创建记录集以获取表头。表头应该直接来自不是用python编写的sql。

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

这段代码让我打开文件,没有标题。也无法弄清楚如何使用文件作为日志。

9 个答案:

答案 0 :(得分:54)

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

的更多信息

答案 1 :(得分:9)

使用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'])

准确创建您期望的格式。

答案 2 :(得分:5)

您可以轻松地手动创建它,使用选定的分隔符编写文件。您也可以使用csv module

如果是来自数据库,您只需使用sqlite客户端的查询:

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

这将创建带有制表符分隔符的csv文件。

答案 3 :(得分:2)

如何从现有表格中提取列标题:

你不需要解析SQL“create table”语句。这是幸运的,因为“create table”语法既不好也不干净,它是warthog-ugly。

您可以使用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!
>>>

现在删除的其他问题“解析create table SQL”答案:

  1. 填充例如create table test (id1 text, id2 int, msg text, primary key(id1, id2)) ...不仅需要忽略CONSTRAINT,还需要忽略关键字PRIMARYUNIQUECHECKFOREIGN(请参阅{{ 3}} docs)。

  2. 如果SQL中有换行符,则需要指定create table

  3. line.split()[0].strip()中,strip是多余的。

答案 4 :(得分:1)

这很简单,对我来说很好。

假设您已经连接到数据库表并且还有一个游标对象。所以继续从那一点开始。

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)

答案 5 :(得分:0)

除非我遗漏了什么,否则你只想这样做......

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

将行写入文件的逻辑(您可能需要组织值并添加通信或管道等...)

f.close()

答案 6 :(得分:0)

您似乎熟悉excel并希望与它保持密切联系。我建议你试试PyExcelerator吗?

答案 7 :(得分:0)

使用pandas和sqlite3可以轻松完成。扩展了Cristian Ciupitu的答案。

import sqlite3
from glob import glob; from os.path import expanduser
conn = sqlite3.connect(glob(expanduser('data/clients_data.sqlite'))[0])
cursor = conn.cursor()

现在使用熊猫读取表并写入csv。

clients = pd.read_sql('SELECT * FROM clients' ,conn)
clients.to_csv('data/Clients100914.csv', index=False)

这更直接,并且始终有效。

答案 8 :(得分:0)

以下代码适用于具有Python 3.6的Oracle:

import cx_Oracle
import csv

# Create tns
dsn_tns=cx_Oracle.makedsn('<host>', '<port>', service_name='<service_name>')

# Connect to DB using user, password and tns settings
conn=cx_Oracle.connect(user='<user>', password='<pass>',dsn=dsn_tns)
c=conn.cursor()

#Execute the Query
c.execute("select * from <table>")

# Write results into CSV file
with open("<file>.csv", "w", newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow([i[0] for i in c.description]) # write headers
    csv_writer.writerows(c)