Как преобразовать все аргументы в строку при форматировании строки - PullRequest
0 голосов
/ 14 октября 2011

Начиная с этого у Кори Голдберга:

#!/usr/bin/env python

import json
import pprint
import urllib2


def get_stock_quote(ticker_symbol):   
    url = 'http://finance.google.com/finance/info?q=%s' % ticker_symbol
    lines = urllib2.urlopen(url).read().splitlines()
    return json.loads(''.join([x for x in lines if x not in ('// [', ']')]))


if __name__ == '__main__':
    quote = get_stock_quote('IBM')
    print 'ticker: %s' % quote['t']
    print 'current price: %s' % quote['l_cur']
    print 'last trade: %s' % quote['lt']
    print 'full quote:'
    pprint.pprint(quote)

Используя это:

import urllib2, json

def get_stock_quote(ticker_symbol):   
    url = 'http://finance.google.com/finance/info?q=%s' % ticker_symbol
    lines = urllib2.urlopen(url).read().splitlines()
    #print lines
    return json.loads(''.join([x for x in lines if x not in ('// [', ']')]))



if __name__ == '__main__':
    symbols = ('Goog',) 
    symbols2 = ('Goog','MSFT')
    quote = get_stock_quote(symbols)
    print 'ticker: %s' % quote['t'],  'current price: %s' % quote['l_cur'], 'last trade: %s' % quote['ltt']
    print quote['t'],  quote['l'], quote['ltt']

Использование символов работает, символы 2 не работает. Сообщение об ошибке

Ошибка типа: не все аргументы, преобразованные во время форматирования строки

Как мне преобразовать все аргументы в строку при форматировании строки. В браузере работает код: Goog, MSFT.

РЕДАКТИРОВАТЬ: вывод, который я ищу, представляет собой список с goog, msft info.

Ответы [ 4 ]

2 голосов
/ 14 октября 2011

Ваша проблема в том, что% s не может обработать кортеж с 2 элементами, см. Этот пример ниже:

>>> "=%s" % ('Goog',)
'=Goog'
>>> "=%s" % ('Goog','MSFT')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

В любом случае, используйте format() вместо %.

1 голос
/ 14 октября 2011

В этом случае вы можете сделать:

import urllib2, json

def get_stock_quote(ticker_symbol):
    if isinstance(ticker_symbol, (list, tuple)):
        ticker_symbol = ','.join(ticker_symbol)
    url = 'http://finance.google.com/finance/info?q=%s' % ticker_symbol
    lines = urllib2.urlopen(url).read().splitlines()
    #print lines
    return json.loads('[%s]' % ''.join([x for x in lines if x not in ('// [', ']')]))

if __name__ == '__main__':
    symbols = ('Goog',) 
    symbols2 = ('Goog','MSFT')
    quotes = get_stock_quote(symbols2)
    for quote in quotes:
        print 'ticker: %s' % quote['t'],  'current price: %s' % quote['l_cur'], 'last trade: %s' % quote['ltt']
        print quote['t'],  quote['l'], quote['ltt']
0 голосов
/ 14 октября 2011

Проблема здесь:

url = 'http://finance.google.com/finance/info?q=%s' % ticker_symbol

С symbols2 вы предоставляете 2-кортеж, тогда как оператор форматирования ожидает скаляр или 1-кортеж.

Следующее исправит немедленную ошибку:

url = 'http://finance.google.com/finance/info?q=%s' % ",".join(ticker_symbol)

Это решает только половину проблемы: код, который анализирует результаты, также необходимо будет изменить. Я оставляю это как упражнение для читателя.

0 голосов
/ 14 октября 2011

Вы получили эту ошибку, потому что форматирование требует только одну строку, в то время как вы ставите кортеж с 2 строками.Если вы хотите получить http://finance.google.com/finance/info?q=Goog,MSFT, вы должны сделать

quote = get_stock_quote(",".join(['Goog','MSFT']))

Или сделать это в цикле:

for symbol in ('Goog', 'MSFT'):
    quote = get_stock_quote(symbol)
...