2013-04-19 6 views
1

다양한 결과에 맞게 동적 인 테이블을 만드는 데 문제가 있습니다.Python에서 테이블의 텍스트 서식 지정

저는 화면 스크레이퍼를 써서 http://finance.yahoo.com에서 주식을 끌어오고 회사 이름과 기호를 인쇄하고 현재 주가가되었습니다.

출력은 다음과 같습니다 그러나 :

Microsoft Corporation MSFT 29.76 

Apple Inc. AAPL 396.77 

SPDR S&P 500 SPY 155.25 

Google Inc. GOOG 787.76 

나는 그것이 내가 어제 파이썬 wokring 시작 3.3.1

내 전류를 사용하고

Microsoft Corporation  MSFT  29.76 

Apple Inc.     AAPL  396.77 

SPDR S&P 500     SPY  155.25 

Google Inc.     GOOG  787.76 

같이 할 코드는 다음과 같습니다 :

import re 
import urllib.request 
import cgi 
from bs4 import BeautifulSoup 

price = [0,0,0,0] 
namesList = ["string1", "string2", "string3", "string4"] 
stocksList = ["msft","aapl","spy","goog"] 

def HTML(): 
    i = 0 
    while i < len(stocksList): 
     htmlPull = urllib.request.urlopen("http://finance.yahoo.com/q?s="+stocksList[i]+"&ql=1") 
     htmlPull = htmlPull.read().decode('utf-8') 
     regex = '<span id="yfs_l84_'+stocksList[i]+'">(.+?)</span>' 
     pattern = re.compile(regex) 
     price[i] = re.findall(pattern,htmlPull) 
     htmlParse = BeautifulSoup(htmlPull) 
     title = htmlParse.title.contents 
     namesList[i] = title   
     i+=1 

formatPrice(price) 
formatStock(namesList) 
formatOutput(namesList, stocksList, price) 

def formatPrice(price): 
    k=0 
    while k < len(price): 
     cleaner = str(price[k]) 
     cleaner = cleaner.replace("[","") 
     cleaner = cleaner.replace("]","") 
     cleaner = cleaner.replace("'","") 
     price[k] = float(cleaner) 
     k+=1 

def formatStock(namesList): 
    k = 0 
    while k <len(namesList): 
     capital = stocksList[k] 
     capital = capital.upper() 
     cleaner = str(namesList[k]) 
     cleaner = cleaner.replace("Summary for ", "") 
     cleaner = cleaner.replace(":"," ") 
     cleaner = cleaner.replace("- Yahoo! Finance'","") 
     cleaner = cleaner.replace("['","") 
     cleaner = cleaner.replace("]","") 
     cleaner = cleaner.replace(";","") 
     cleaner = cleaner.replace(capital, "") 
     namesList[k] = cleaner; 
     k+=1 

    def formatOutput(namesList, stocksList, price): 
     i = 0 
     while i < len(price): 
     capital = stocksList[i] 
     capital = capital.upper() 
     print(namesList[i],capital, price[i]) 
     print("") 
     i+=1 
HTML() 

인쇄물 {{0}, {1}, {2} .format (namesList, capital, price [i])), 다양한 유형의 {: < 16} 개 변형 등을 시도했습니다. 그리고 필자는 텍스트 나 공백이 채워야하는 열이나 표 또는 어쩌면 일정량의 공간에 대해 생각하게하려고합니다. 정확히 무슨 해결책이 여기에 있는지 잘 모르겠다. 그래서 나는 모두에게 묻고있다. :)

내 코드로 알 수 있듯이, 나는 프로그래밍에 익숙하지 않기 때문에 할 수있는 더 좋은 방법이있다. 이 코드의 내용은 수정, 조언 및 제안에 귀 기울여 드리겠습니다.

답변

1

열의 가장 긴 항목을 기준으로 너비를 설정하려고합니다.

파이썬에서는 max을 사용하여 가장 큰 그룹을 찾습니다. 그래서, 루프 밖에서, 당신이 할 수 있습니다 : 당신은 당신이 시도 말했듯이 그런

names_width = max(len(name) for name in namesList) 
stock_width = max(len(stock) for stock in stockList) 

은, 각 행의 형식을 :

print({0:{3}} {1:{4}} {2}.format(namesList[i], 
            capital, 
            price[i], 
            names_width, 
            stock_width)) 
+0

이것은 완벽하게 작동, 감사합니다! 내가 만든 유일한 변경 사항은 names_width 및 stock_width에 +2를 추가하여 공간을 조금 더 넓혔습니다. 또한 Python 3.3.1에서 중괄호 주위에 아포스트로피를 추가하여 올바른 구문으로 표시되도록했습니다. –