如何在 Python 中从数据库创建 CSV 文件?
Posted
技术标签:
【中文标题】如何在 Python 中从数据库创建 CSV 文件?【英文标题】:How do I create a CSV file from database in Python? 【发布时间】:2011-04-12 05:39:09 【问题描述】:我有一个名为“clients”的 Sqlite 3 和/或 mysql 表..
使用 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)
这段代码让我打开了文件并且没有标题。也无法弄清楚如何将文件用作日志。
【问题讨论】:
你想将该表的内容放入文件中吗? 使用csv
模块有什么问题?
我需要表格的所有内容和日期。
我想出了大部分。仍然需要仅来自数据库的标题帮助。我可以获取数据。
@user428862:你试过什么代码?请发布您的代码。如果您需要“仅来自数据库的标题”的帮助,您需要解释您的意思并显示不起作用的代码。
【参考方案1】:
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
的信息。
【讨论】:
对于游标中的行:csv_writer.writerow(row) >csv_writer.writerows(row) @user428862:该代码还应该适用于 MySQL 或 Sybase 数据库。我已根据您的建议更新了答案。 您应该以文本模式打开文件 @glefait,实际上不,文档建议使用二进制模式。另请参阅答案历史中的修订版 7。 我在 python3 和 linux 上运行它。如果我将它作为二进制文件打开,我需要将我的文本值转换为二进制。【参考方案2】:使用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'])
精确创建您期望的格式。
【讨论】:
它不会以编程方式写入表的标题。【参考方案3】:您可以轻松地手动创建它,使用选定的分隔符编写文件。你也可以使用csv module。
如果它来自数据库,您也可以只使用来自您的 sqlite 客户端的查询:
sqlite <db params> < queryfile.sql > output.csv
这将创建一个带有制表符分隔符的 csv 文件。
【讨论】:
当然可以在sqlite命令中使用.separator ,
命令,使csv文件使用逗号分隔符。
它会转义数据中的分隔符吗?【参考方案4】:
如何从现有表格中提取列标题:
您不需要解析 SQL“创建表”语句。这很幸运,因为“创建表”语法既不好也不干净,它是 warthog-ugly。 p>
您可以使用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”答案的其他问题:
填充例如create table test (id1 text, id2 int, msg text, primary key(id1, id2))
... 不仅需要忽略CONSTRAINT
,还需要忽略关键字PRIMARY
、UNIQUE
、CHECK
和FOREIGN
(参见create table
文档)。
需要指定re.DOTALL
以防SQL中有换行符。
在line.split()[0].strip()
中,strip
是多余的。
【讨论】:
谢谢,john....在下面的代码中,我只需要在现有代码中添加两行...Go Python!【参考方案5】:这很简单,对我来说效果很好。
假设您已经连接到数据库表并且还获得了一个游标对象。所以从那一点开始。
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)
【讨论】:
【参考方案6】:除非我错过了什么,否则你只想做这样的事情......
f = open("somefile.csv")
f.writelines("header_row")
将行写入文件的逻辑(您可能需要组织值并添加通信或管道等...)
f.close()
【讨论】:
虽然纪尧姆的回答更直接。【参考方案7】:使用 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()
现在使用 pandas 读取表格并写入 csv。
clients = pd.read_sql('SELECT * FROM clients' ,conn)
clients.to_csv('data/Clients100914.csv', index=False)
这样更直接,而且一直有效。
【讨论】:
【参考方案8】:以下代码适用于带有 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)
【讨论】:
别忘了调整arraysize
和prefetchrows
,参见cx_Oracle 调整文档:cx-oracle.readthedocs.io/en/latest/user_guide/…以上是关于如何在 Python 中从数据库创建 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 python3 中从 excel 文件(不是 CSV)创建字典吗?