sourcecode

python을 사용하여 csv에 mysql 쿼리를 쓰는 경우 필드 이름을 표시해야 합니다.

copyscript 2022. 12. 26. 20:33
반응형

python을 사용하여 csv에 mysql 쿼리를 쓰는 경우 필드 이름을 표시해야 합니다.

다음과 같은 것이 있습니다.

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에 연결하는 보다 현대적인 예입니다. 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's 메서드를 사용하여 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.insert(0, tuple(headers))
fp = open('/tmp/file.csv', 'w', newline = '') 
myFile = csv.writer(fp)
myFile.writerows(rows)
fp.close()

@jwhat answer에 하나만 더 추가해 주세요.

이 csv 파일을 윈도에서 열려면 빈 행을 추가로 처리해야 합니다.

2.7의 기본 행 결정자는 \r\n이므로 코드를 다음과 같이 변경합니다.

myFile = csv.writer(fp, lineterminator='\n')

작은 비단뱀은 알고 있습니다만, 구글링을 조금 한 후, 한 행을 기대하는 writerow가 아니라 여러 행을 쓰는 writerow(S가 있는 writerow)를 사용해야 합니다.

내가 말했듯이 이건 내 어둠을 찌르는 것 같아.

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

언급URL : https://stackoverflow.com/questions/4613465/using-python-to-write-mysql-query-to-csv-need-to-show-field-names

반응형