如何在字符串格式化中将所有参数转换为字符串

0 投票
4 回答
2047 浏览
提问于 2025-04-17 04:19

从Corey Goldberg的内容开始:

#!/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']

使用符号是可以的,但symbols2就不行。错误信息是:

类型错误:在字符串格式化时并不是所有参数都被转换

我该如何在字符串格式化时将所有参数都转换为字符串呢?在浏览器中,能正常工作的代码是:Goog,MSFT。

编辑:我想要的输出是一个包含goog和msft信息的列表。

4 个回答

0

问题出在这里:

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

在使用 symbols2 时,你提供了一个包含两个元素的元组,但格式化操作符其实只需要一个单一的值或者一个包含一个元素的元组。

下面的代码可以解决这个直接的问题:

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

不过,这只解决了一半的问题:处理结果的代码也需要进行修改。我把这个留给你自己去练习。

2

你的问题是 %s 不能处理包含两个元素的元组,看看下面这个例子:

>>> "=%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

在这种情况下,你可以这样做:

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']

撰写回答