Используя python для записи запроса MySQL в CSV, необходимо показать имена полей - PullRequest
26 голосов
/ 06 января 2011

У меня есть следующее:

    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))

Ответы [ 7 ]

28 голосов
/ 30 июля 2012

Вы можете вывести все результаты в файл csv без зацикливания:

rows = cursor.fetchall()
fp = open('/tmp/file.csv', 'w')
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()
18 голосов
/ 06 января 2011

result - список строк. Поэтому вам нужно будет перебрать этот список и написать каждую строку:

for row in result:
    c.writerow(row)
3 голосов
/ 13 июля 2018

Предыдущий ответ даст ошибку. Заголовок должен быть сначала записан в файл, а затем добавлены строки. Следующее сработало для меня.

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 голосов
/ 15 декабря 2017

Ответ с именами заголовков столбцов для всех, кто сталкивался с этим: (я использую метод 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()
1 голос
/ 10 мая 2016

Просто добавьте еще одну вещь в ответ @jwhat.

Если вы собираетесь открыть этот CSV-файл в Windows, вам нужно будет обработать лишние пустые строки.

просто измените кодк следующему, в качестве переводчика строки по умолчанию в 2.7 используется \ r \ n

myFile = csv.writer(fp, lineterminator='\n')
1 голос
/ 06 января 2011

Я немного знаю Python, но после небольшого поиска в Google, вы должны использовать writerows (с S), который пишет несколько строк, а не writerow, который ожидает одну строку.

Как я уже сказал, это немного укол в темноте от меня.

0 голосов
/ 19 февраля 2019
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()
...