[PYTHON] Python으로 MySQL 형식으로 결과 인쇄
PYTHONPython으로 MySQL 형식으로 결과 인쇄
MySQL이 파이썬을 사용하여 콘솔에서 출력하는 것과 같은 방법으로 MySQL 쿼리의 결과를 출력하는 가장 쉬운 방법은 무엇입니까? 예를 들어 나는 다음과 같은 것을 얻고 싶다 :
+---------------------+-----------+---------+
| font | documents | domains |
+---------------------+-----------+---------+
| arial | 99854 | 5741 |
| georgia | 52388 | 1955 |
| verdana | 43219 | 2388 |
| helvetica neue | 22179 | 1019 |
| helvetica | 16753 | 1036 |
| lucida grande | 15431 | 641 |
| tahoma | 10038 | 594 |
| trebuchet ms | 8868 | 417 |
| palatino | 5794 | 177 |
| lucida sans unicode | 3525 | 116 |
| sans-serif | 2947 | 216 |
| times new roman | 2554 | 161 |
| proxima-nova | 2076 | 36 |
| droid sans | 1773 | 78 |
| calibri | 1735 | 64 |
| open sans | 1479 | 60 |
| segoe ui | 1273 | 57 |
+---------------------+-----------+---------+
17 rows in set (19.43 sec)
주의 사항 : 각 열의 최대 너비를 선험적으로 알지는 못했지만 테이블을 두 번지나 가지 않고도 그럴 수 있기를 바랍니다. 각 열에 대한 쿼리 길이 ()를 추가해야합니까? 메모리 나 처리 시간에 심각한 영향을 미치지 않기 위해 MySQL은 어떻게합니까?
편집하다
나는 그것이 질문과 관련이 있다고 생각하지는 않았지만 이것은 내가 보낸 질의이다 :
SELECT font.font as font,count(textfont.textid) as documents, count(DISTINCT td.domain) as domains
FROM textfont
RIGHT JOIN font
ON textfont.fontid = font.fontid
RIGHT JOIN (
SELECT text.text as text,url.domain as domain, text.textid as textid
FROM text
RIGHT JOIN url
ON text.texturl = url.urlid) as td
ON textfont.textid = td.textid
WHERE textfont.fontpriority <= 0
AND textfont.textlen > 100
GROUP BY font.font
HAVING documents >= 1000 AND domains >= 10
ORDER BY 2 DESC;
그리고 이것은 제가 사용하는 파이썬 코드입니다 :
import MySQLdb as mdb
print "%s\t\t\t%s\t\t%s" % ("font","documents","domains")
res = cur.execute(query , (font_priority,text_len,min_texts,min_domains))
for res in cur.fetchall():
print "%s\t\t\t%d\t\t%d" % (res[0],res[1],res[2])
그러나이 코드는 다른 너비 때문에 출력이 지저분 해집니다.
해결법
-
==============================
1.예쁜 테이블 사용
예쁜 테이블 사용
x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.set_field_align("City name", "l") # Left align city names x.set_padding_width(1) # One space between column edges and contents (default) x.add_row(["Adelaide",1295, 1158259, 600.5]) x.add_row(["Brisbane",5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print x +-----------+------+------------+-----------------+ | City name | Area | Population | Annual Rainfall | +-----------+------+------------+-----------------+ | Adelaide | 1295 | 1158259 | 600.5 | | Brisbane | 5905 | 1857594 | 1146.4 | | Darwin | 112 | 120900 | 1714.7 | | Hobart | 1357 | 205556 | 619.5 | | Sydney | 2058 | 4336374 | 1214.8 | | Melbourne | 1566 | 3806092 | 646.9 | | Perth | 5386 | 1554769 | 869.4 | +-----------+------+------------+-----------------+
-
==============================
2.외부 라이브러리가 필요 없습니다. 는 열 이름으로 데이터를 인쇄합니다. 열 이름이 필요하지 않으면 'columns'변수가있는 모든 행을 제거 할 수 있습니다.
외부 라이브러리가 필요 없습니다. 는 열 이름으로 데이터를 인쇄합니다. 열 이름이 필요하지 않으면 'columns'변수가있는 모든 행을 제거 할 수 있습니다.
sql = "SELECT * FROM someTable" cursor.execute(sql) conn.commit() results = cursor.fetchall() widths = [] columns = [] tavnit = '|' separator = '+' for cd in cursor.description: widths.append(max(cd[2], len(cd[0]))) columns.append(cd[0]) for w in widths: tavnit += " %-"+"%ss |" % (w,) separator += '-'*w + '--+' print(separator) print(tavnit % tuple(columns)) print(separator) for row in results: print(tavnit % row) print(separator)
다음은 출력입니다.
+--------+---------+---------------+------------+------------+ | ip_log | user_id | type_id | ip_address | time_stamp | +--------+---------+---------------+------------+------------+ | 227 | 1 | session_login | 10.0.0.2 | 1358760386 | | 140 | 1 | session_login | 10.0.0.2 | 1358321825 | | 98 | 1 | session_login | 10.0.0.2 | 1358157588 | +--------+---------+---------------+------------+------------+
마법은 각 cursor.description 행의 세 번째 열에 있습니다 (코드에서 cd [2]라고 함). 이 열은 가장 긴 값의 문자 길이를 나타냅니다. 따라서 우리는 표시되는 열의 크기를 열 머리글 자체의 길이와 max (cd [2], len (cd [0])) 사이의 값으로 지정합니다.
-
==============================
3.너는 2 개의 통행을 할 필요가있다 :
너는 2 개의 통행을 할 필요가있다 :
그래서
table = cur.fetchall() widths = [0]*len(table[0]) # Assuming there is always one row for row in table: widths = [max(w,len(c)) for w,c in zip(widths,row)]
이제 테이블을 쉽게 인쇄 할 수 있습니다.
숫자를 인쇄 할 때는 string.rjust 메서드를 기억하십시오.
최신 정보
폭을 계산하는보다 기능적인 방법은 다음과 같습니다.
sizetable = [map(len,row) for row in table] widths = map(max, zip(*sizetable))
-
==============================
4.데이터가 보이는 일부 목록에 있으며 헤더를 인쇄 중입니다. 다음과 같은 형식을 고려하십시오.
데이터가 보이는 일부 목록에 있으며 헤더를 인쇄 중입니다. 다음과 같은 형식을 고려하십시오.
res = ['trebuchet ms', 8868, 417] res = ['lucida sans unicode', 3525, 116]
과
print(' {0[0]:20s} {0[1]:10d} {0[2]:10d}'.format(res))
너에게 줄께.
trebuchet ms 8868 417 lucida sans unicode 3525 116
목록에 대한 색인 생성은 문자열 내부에서 수행되므로 format은 목록 또는 튜플을 제공하면됩니다.
또는 너비를 프로그래밍 방식으로 지정할 수 있습니다.
wid1 = 20 wid2 = 10 wid3 = 10 print(' {:{}s} {:{}d} {:{}d}'.format(res[0], wid1, res[1], wid2, res[2], wid3))
위와 동일한 출력을 제공합니다.
필요에 따라 필드 너비를 조정하고 샘플 라인을 구성하는 대신 데이터의 각 라인에 대해 목록을 반복해야합니다. 숫자는 자동으로 오른쪽 정렬되며 문자열은 자동으로 남습니다.
장점은, 물론 외부 라이브러리에 의존하지 않고, 파이썬이 이미 제공하고있는 것으로 완성된다.
from https://stackoverflow.com/questions/10865483/print-results-in-mysql-format-with-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] is_authenticated ()가 TypeError를 발생시킵니다. TypeError : 'bool'객체를 호출 할 수 없습니다. [duplicate] (0) | 2018.11.17 |
---|---|
[PYTHON] Python pandas, 여러 행의 플로팅 옵션 (0) | 2018.11.17 |
[PYTHON] 패키징을 위해 console_script 진입 점 인터프리터 변경 (0) | 2018.11.17 |
[PYTHON] pycharm에서 Conda 환경 사용 (0) | 2018.11.17 |
[PYTHON] 데코레이터 클래스와 데코레이터 함수의 차이점 (0) | 2018.11.17 |