我有以下内容:
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正是我所寻找的。 p>
这是Python 3中使用pymysql驱动程序连接到MariaDB的更现代的示例,它将选择并将所有行提取到元组中,将行标题/描述添加到列表中。然后我将这两个数据结构合并为一个列表,为written to a csv file。
标题名称是结果列表中的第一个条目;将结果以线性方式写入文件,确保行标题是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))
答案 0 :(得分:27)
您可以将所有结果转储到csv文件而不循环:
rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
答案 1 :(得分:18)
result
是一个行列表。因此,您需要遍历该列表并编写每一行:
for row in result:
c.writerow(row)
答案 2 :(得分:3)
为遇到此问题的任何人回答列标题名称: (我正在使用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()
答案 3 :(得分:3)
上一个答案将给出一个错误。必须先将标头写入文件,然后再添加行。以下对我有用。
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()
答案 4 :(得分:1)
我知道很少的python,但是经过一些谷歌搜索之后,你应该使用写入多行的writer(而不是编写器,而不是写一行需要单行。)
正如我所说,这对我来说是一个黑暗的刺痛。
答案 5 :(得分:1)
再向@jwhat回答添加一件事。
如果您打算在Windows中打开此csv文件,则需要处理额外的空行。
只需将代码更改为以下内容,因为2.7中的默认行终止符为\ r \ n
myFile = csv.writer(fp, lineterminator='\n')
答案 6 :(得分: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()