45

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

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 は私が探していたものです。

pymysqlドライバーを使用してMariaDBに接続するPython 3 の最新の例を次に示します。これは、すべての行を選択してタプルにフェッチし、行ヘッダー/説明をリストにフェッチします。次に、これら 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))
4

7 に答える 7

37

ループせずにすべての結果を csv ファイルにダンプできます。

rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
于 2012-07-30T16:51:04.777 に答える
18

result行のリストです。したがって、そのリストを繰り返し処理して、各行を書き込む必要があります。

for row in result:
    c.writerow(row)
于 2011-01-06T10:45:57.187 に答える
1

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

私が言うように、これは私からの暗闇の中でのちょっとした刺し傷です.

于 2011-01-06T10:45:12.070 に答える
0
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()
于 2019-02-19T03:57:40.020 に答える