web-dev-qa-db-ja.com

PythonでデータベースからCSVファイルを作成するにはどうすればよいですか?

「clients」という名前のSqlite 3および/またはMySQLテーブルがあります。

python 2.6、ヘッダー付きのClients100914.csvという名前のcsvファイルを作成するにはどうすればよいですか?Excel dialect ...

Sql execute:select *はテーブルデータのみを提供しますが、ヘッダー付きの完全なテーブルが必要です。

テーブルヘッダーを取得するレコードセットを作成するにはどうすればよいですか。テーブルヘッダーは、Pythonで記述されていないSQLから直接取得する必要があります。

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

このコードでは、ファイルが開いたままでヘッダーがありません。また、ファイルをログとして使用する方法を理解することはできません。

25
Merlin
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に関する詳細情報があります。

59

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

期待どおりのフォーマットを作成します。

9
Stephen Johnson

手動で簡単に作成し、選択したセパレータでファイルを作成できます。 csv module を使用することもできます。

データベースからのものである場合は、sqliteクライアントからのクエリを使用できます。

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

これはタブ区切り付きのcsvファイルを作成します。

既存のテーブルから列見出しを抽出する方法:

SQLの「テーブル作成」ステートメントを解析する必要はありません。「テーブル作成」構文はニースでもクリーンでもないので、これは幸いです。イボイノシゴです。

_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だけでなく、キーワードPRIMARYUNIQUECHECKおよびFOREIGN_create table_ のドキュメントを参照)。

  2. SQLに改行がある場合に _re.DOTALL_ を指定する必要があります。

  3. line.split()[0].strip()では、stripは冗長です。

2
John Machin

これは簡単で、私にとってはうまくいきます。

データベーステーブルに既に接続しており、カーソルオブジェクトも取得しているとします。したがって、その時点から続けます。

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)
1
Francis Kessie

Excelに精通しているようで、その近くに滞在したい。 PyExcelerator ?を試してみることをお勧めします。

0
inspectorG4dget

私が何かを逃さない限り、あなたはそのようなことをしたいだけです...

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

ファイルに行を書き込むロジック(値を整理し、通信やパイプなどを追加する必要がある場合があります...)

f.close()
0
user39178