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
'sourcecode' 카테고리의 다른 글
perl - 2개의 데이터베이스에서 2개의 SQL 쿼리로 이루어진 2개의 열을 비교합니다. (0) | 2022.12.26 |
---|---|
org.codehouse.com과 com.codexml.core의 비교 (0) | 2022.12.26 |
소스 및 JavaDoc을 사용하여 Snapshot을 도입하는 방법 (0) | 2022.12.26 |
PHP 세션은 어떻게 작동합니까?('사용방법'이 아닙니다.") (0) | 2022.12.26 |
MySQL-Server 설치 시 MariaDB 설치를 방지하는 방법 (0) | 2022.12.26 |