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

这是 Python 3 中更现代的示例,使用pymysql驱动程序连接到MariaDB,它将选择所有行并将其提取到一个元组中,将行标题/描述放入一个列表中。然后我将这两个数据结构合并到一个列表中,写入一个 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 回答
15

为遇到此问题的任何人回答列标题名称:(我正在使用 Jwhat 的方法写入 csv)

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()
于 2017-12-14T22:21:00.120 回答
8

上一个答案会出错。必须先将标头写入文件,然后再添加行。以下对我有用。

rows = cursor.fetchall()
headers = [col[0] for col in cursor.description] # get headers
rows.insert(0, tuple(headers))
fp = open('/tmp/file.csv', 'w', newline = '') 
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
于 2018-07-13T02:30:17.343 回答
2

只需在@jwhat 答案中添加一件事。

如果您打算在 Windows 中打开此 csv 文件,则需要处理多余的空行。

只需将代码更改为以下内容,因为 2.7 中的默认换行符是 \r\n

myFile = csv.writer(fp, lineterminator='\n')
于 2016-05-10T07:54:20.057 回答
1

我知道一点python,但是经过一番谷歌搜索后,您是否应该使用写入多行的 writerows(带有 S),而不是需要单行的 writerow。

正如我所说,这对我来说有点像在黑暗中刺伤。

于 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 回答