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

如何从Python中的数据库创建CSV文件?,python,mysql,sqlite,file-io,csv,Python,Mysql,Sqlite,File Io,Csv,我有一个名为clients的Sqlite 3和/或MySQL表 使用python 2.6,如何创建一个名为Clients100914.csv的csv文件,并带有标题? excel方言 Sql execute:select*只提供表数据,但我希望完整的表带有标题 如何创建记录集以获取表标题。表头应该直接来自不是用python编写的sql w = csv.writer(open(Fn,'wb'),dialect='excel') #w.writelines("header_row") #Fetch

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

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

Sql execute:select*只提供表数据,但我希望完整的表带有标题

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

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

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

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

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

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

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

除非我遗漏了一些内容,否则您只需要这样做

f = open("somefile.csv")
f.writelines("header_row")
将行写入文件的逻辑您可能需要组织值并添加命令或管道等

f.close()
使用是非常直接的,适合此任务

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'])
准确创建所需的格式。

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

您不需要解析SQLCREATETABLE语句。这是幸运的,因为CREATETABLE语法既不好也不干净,所以它很难看

您可以使用pragma。它提供了有关表中每列的有用信息,包括列的名称

例如:

>>> #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答案的其他问题:

填充例如创建表测试id1文本、id2 int、msg文本、主键id1、id2。。。不仅需要忽略约束,还需要忽略关键字PRIMARY、UNIQUE、CHECK和FOREIGN查看文档

需要指定SQL中是否有换行符

行中。拆分[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)

使用pandas和sqlite3可以很容易地完成。作为对克里斯蒂安·齐皮托回答的延伸

import sqlite3
from glob import glob; from os.path import expanduser
conn = sqlite3.connect(glob(expanduser('data/clients_data.sqlite'))[0])
cursor = conn.cursor()
现在使用pandas读取表并写入csv

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

这更直接,并且一直有效。

下面的代码适用于使用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)

你想把表格的内容放到文件中吗?使用csv模块有什么问题吗?我需要表格的所有内容和日期。我找到了大部分内容。仍然需要来自数据库的标题帮助。我可以获取数据。@user428862:您尝试过什么代码?请张贴您的密码。如果您只需要从数据库获取标题帮助,则需要解释您的意思并显示不起作用的代码。尽管Guillaume的回答更直接。当然,命令.separator,可以在sqlite命令中使用,以使csv文件使用逗号分隔符。它是否在数据中转义分隔符?它不会以编程方式写入表的标题。谢谢,john。。。。在下面的代码中,我只需在现有代码中添加两行。。。走吧,巨蟒!对于光标中的行:csv_writer.writerowrow>csv_writer。writerowsrow@user428862:该代码还应适用于MySQL或Sybase数据库。我已经用你的建议更新了答案。你应该用文本打开你的文件mode@glefait,实际上不是,文档建议使用二进制模式。另请参阅答案历史中的修订版7。我在python3和linux上运行它。如果我将其作为二进制文件打开,我需要将文本值转换为二进制。不要忘记调整数组大小和预取行,请参阅cx\U 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)