Форматирование текста в таблице в 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

Я хочу, чтобы это выглядело как

Microsoft Corporation        MSFT      29.76

Apple Inc.                   AAPL      396.77

SPDR S&P 500                 SPY       155.25

Google Inc.                  GOOG      787.76

Я только вчера начал работать с Python и использую 3.3.1.

Мой текущий код выглядит следующим образом:

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

Пробовал print ({0},{1},{2}.format (namesList, capital, price[i])), различные типы вариантов {:‹16} и т. д. Кажется, это влияет только на одну строку, и я Я пытаюсь заставить его думать с точки зрения столбцов или таблиц, или, может быть, определенного пространства, которое должны заполнить текст и пробелы. Я не уверен, какое именно решение здесь, поэтому я спрашиваю вас всех :)

Как вы можете судить по моему коду, я довольно новичок в программировании, поэтому, если есть лучший способ сделать что-либо в этом коде, я был бы рад выслушать исправления, советы и предложения.


person Ben Sailors    schedule 19.04.2013    source источник


Ответы (1)


Вы хотите установить ширину на основе самого длинного элемента в столбце.

В Python вы используете 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))
person agf    schedule 19.04.2013
comment
Это сработало отлично, спасибо! Единственное изменение, которое я сделал, это добавить +2 к именам_width и stock_width, чтобы увеличить расстояние между ними. Также в Python 3.3.1 мне пришлось добавить апострофы вокруг фигурных скобок, чтобы получить правильный синтаксис. - person Ben Sailors; 19.04.2013