web-dev-qa-db-ja.com

pythonを使用してmysqlクエリをcsvに書き込むには、フィールド名を表示する必要があります

私は次のものを持っています:

    import MySQLdb as dbapi
    import sys
    import csv

    dbServer='localhost'
    dbPass='supersecretpassword'
    dbSchema='dbTest'
    dbUser='root'

    dbQuery='SELECT * FROM pbTest.Orders;'

    db=dbapi.connect(Host=dbServer,user=dbUser,passwd=dbPass)
    cur=db.cursor()
    cur.execute(dbQuery)
    result=cur.fetchall()

    c = csv.writer(open("temp.csv","wb"))
    c.writerow(result)

これにより、文字化けした混乱が生じます。私は印刷レコード[0]などの使用に精通しています。フォーマットの設定方法についてはわかりません。コンソールでのクエリのようなものを生成します。 mysqlサーバーから単純なINTO OUTFILEを実行できません。


更新

8年が経ちました。この質問について、時々更新や問い合わせがあります。

いくつかのコメントで述べたように、DBAPIからの cursor.description が私が探していたものです。

Python 3 pymysql ドライバーを使用して MariaDB に接続し、すべての行を選択して取得する)の最新の例を次に示します。タプル、行ヘッダー/説明をリストに追加し、これら2つのデータ構造を1つのリストにマージして、 csvファイルに書き込まれる にします。

結果リストの最初のエントリであるヘッダー名。結果を線形形式でファイルに書き込むと、行ヘッダーがCSVファイルの最初の行になります。

import pymysql
import csv
import sys

db_opts = {
    'user': 'A',
    'password': 'C',
    'Host': 'C',
    'database': 'D'
}

db = pymysql.connect(**db_opts)
cur = db.cursor()

sql = 'SELECT * from schema_name.table_name where id=123'
csv_file_path = '/tmp/my_csv_file.csv'

try:
    cur.execute(sql)
    rows = cur.fetchall()
finally:
    db.close()

# Continue only if there are rows returned.
if rows:
    # New empty list called 'result'. This will be written to a file.
    result = list()

    # The row name is the first entry for each entity in the description Tuple.
    column_names = list()
    for i in cur.description:
        column_names.append(i[0])

    result.append(column_names)
    for row in rows:
        result.append(row)

    # Write result to file.
    with open(csv_file_path, 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for row in result:
            csvwriter.writerow(row)
else:
    sys.exit("No rows found for query: {}".format(sql))

28
Mathnode

ループすることなく、すべての結果をcsvファイルにダンプできます。

rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
28
jwhat

resultは行のリストです。そのため、そのリストを反復処理して各行を記述する必要があります。

for row in result:
    c.writerow(row)
18
Daniel Roseman

これに遭遇した人には列ヘッダー名で答えてください:(私はcsvに書き込むためにJwhatのメソッドを使用しています)

result = cur.fetchall()

#Getting Field Header names
column_names = [i[0] for i in cur.description]
fp = open('Result_Set.csv' 'w')
myFile = csv.writer(fp, lineterminator = '\n') #use lineterminator for windows
myFile.writerow(column_names)
myFile.writerows(result)
fp.close()
3
Mwspencer

前の答えはエラーになります。最初にヘッダーをファイルに書き込み、次に行を追加する必要があります。次は私のために働いた。

rows = cursor.fetchall()
headers = [col[0] for col in cursor.description] # get headers
rows = (Tuple(headers),) + rows # add headers to rows
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerow(headers)
myFile.writerows(rows)
fp.close()
3
George B

@jwhat応答にもう1つ追加するだけです。

このcsvファイルをWindowsで開く場合は、余分な空行を処理する必要があります。

2.7のデフォルトのラインターミネータは\ r\nなので、コードを次のように変更するだけです

myFile = csv.writer(fp, lineterminator='\n')
1
HappyBambi

私は小さなPythonを知っていますが、少しグーグルした後、単一の行を期待するwriterowではなく、複数の行を書き込むwriterows(S付き)を使用する必要があります。

私が言うように、これは私から暗闇の中で少し刺します。

1
Jaydee
import pymysql
import sys
import csv

connection = pymysql.connect(Host='abcde',
user='admin',
password='secret',
db='databaseName',
port=12345)

dbQuery="SELECT field1, field2, fieldn FROM database.table;"
cur=connection.cursor()
cur.execute(dbQuery)
rows=cur.fetchall()
column_names = [i[0] for i in cur.description]
fp = open('DimDevice.csv', 'w')
myFile = csv.writer(fp, lineterminator = '\n')
myFile.writerow(column_names)   
myFile.writerows(rows)
fp.close()
0
MAES