我有一个名为“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)
这段代码让我打开文件,没有标题。也无法弄清楚如何使用文件作为日志。
答案 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”答案:
填充例如create table test (id1 text, id2 int, msg text, primary key(id1, id2))
...不仅需要忽略CONSTRAINT
,还需要忽略关键字PRIMARY
,UNIQUE
,CHECK
和FOREIGN
(请参阅{{ 3}} docs)。
如果SQL中有换行符,则需要指定create table
。
在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)