Ответ 1
Вы можете отправить все результаты в файл csv без цикла:
rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
У меня есть следующее:
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] и т.д. Не знаю, как мне поступить с настройкой форматирования. производить что-то вроде того, что запрос будет в консоли. Я не могу сделать простой INTO OUTFILE с сервера MySQL.
Обновление
Прошло 8 лет; Я все еще получаю время от времени обновление или запрос по этому вопросу.
Как указано в некоторых комментариях, я искал cursor.description из DBAPI.
Вот более современный пример в 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))
Вы можете отправить все результаты в файл csv без цикла:
rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
result
- список строк. Таким образом, вам нужно пройти через этот список и написать каждую строку:
for row in result:
c.writerow(row)
Ответьте с именами заголовков столбцов для всех, кто сталкивался с этим: (Я использую метод 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()
Предыдущий ответ даст ошибку. Заголовок должен быть сначала записан в файл, а затем добавлены строки. Следующее сработало для меня.
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()
Я знаю маленький python, но после небольшого поиска в googling, вы должны использовать записи (с S), который пишет несколько строк, а не writerow, который ожидает одну строку.
Как я уже сказал, это немного удар в темноте от меня.
Просто добавьте еще одну вещь в ответ @jwhat.
Если вы планируете открыть этот файл csv в окнах, вам нужно будет обрабатывать лишние пустые строки.
просто измените код на следующий, так как по умолчанию в определителе по умолчанию равен \r\n
myFile = csv.writer(fp, lineterminator='\n')
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()