操作数类型错误:一元加号无法应用于字符串。

51

我无法解决我在使用 Python 2.7 编写的代码中遇到的问题。我正在将引用转换为整数,但是我一直收到类型异常 bad operand type for unary +: 'str'。有人可以帮助吗?

import urllib2
import time
import datetime

stocksToPull = 'EBAY', 'AAPL'


def pullData(stock):
    try:
        print 'Currently pulling', stock
        print str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'))
        urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + \
            stock + '/chartdata;type=quote;range=3y/csv'
        saveFileLine = stock + '.txt'

        try:
            readExistingData = open(saveFileLine, 'r').read()
            splitExisting = readExistingData.split('\n')
            mostRecentLine = splitExisting[-2]
            lastUnix = mostRecentLine.split(',')[0]
        except Exception, e:
            print str(e)
            time.sleep(1)
            lastUnix = 0

        saveFile = open(saveFileLine, 'a')
        sourceCode = urllib2.urlopen(urlToVisit).read()
        splitSource = sourceCode.split('\n')

        for eachLine in splitSource:
            if 'values' not in eachLine:
                splitLine = eachLine.split(',')
                if len(splitLine) == 6:
                    if int(splitLine[0]) > int(lastUnix):
                        lineToWrite = eachLine + '\n'
                        saveFile.write(lineToWrite)
        saveFile.close()

        print 'Pulled', + stock
        print 'Sleeping....'
        print str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'))
        time.sleep(120)

    except Exception, e:
        print 'main loop', str(e)


for eachStock in stocksToPull:
    pullData(eachStock)

当程序执行到 if int(splitLine[0]) > int(lastUnix): 时,我遇到了操作数异常 bad operand type for unary +: 'str',即使在测试时打印出来的两个值都是整数。有人能给我一些反馈吗?谢谢!

以下是异常响应:

Currently pulling EBAY
2013-12-21 11:32:40
Pulled main loop bad operand type for unary +: 'str'
Currently pulling AAPL
2013-12-21 11:32:41
Pulled main loop bad operand type for unary +: 'str'`

3
不要只是捕获异常并打印它,因为这样会丢失堆栈跟踪信息! - Eric
1
请注意,如果您尝试连接在条件检查中使用的字符串,也会发生这种情况。例如 if string1: res = string1 + 'moreText' - Jun
8
如果你在这个页面上看到这段话:“如果你 _str += str1 + str2 + + str3”,那么你会遇到同样的错误。请注意 + + 中间没有任何内容。请注意,此处使用了加号两次。 - Joshua Burns
@JoshuaBurns 这解决了我阅读此帖子的原因。有时候,正是一些小语法问题会让你犯错;在我的情况下,是一个多余的逗号。谢谢。 - endorpheus
3个回答

52

你说if int(splitLine[0]) > int(lastUnix):有问题,但你并没有展示任何证据表明它是有问题的。 我认为实际上是这一行出了问题:

print 'Pulled', + stock

你能看出为什么这行代码会导致错误信息吗?你需要使用以下两种方式之一:

>>> stock = "AAAA"
>>> print 'Pulled', stock
Pulled AAAA
或者
>>> print 'Pulled ' + stock
Pulled AAAA

>>> print 'Pulled', + stock
PulledTraceback (most recent call last):
  File "<ipython-input-5-7c26bb268609>", line 1, in <module>
    print 'Pulled', + stock
TypeError: bad operand type for unary +: 'str'
你要求Python将+符号应用于像+23这样的字符串,就像可以将其转换为正数23一样,但她表示反对。

1
感谢您的反馈,这是我的失误,对于此次错误的引导我深感抱歉。非常感谢您的帮助,我花了一段时间看错了东西!:( - heinztomato
2
另一个不是罪犯的原因是打字错误 str =+ 'some text',当然应该是 str += 'some text' - Mark Kortink

16

在添加缺失的 except 子句 / import 语句后,代码对我有效。

您是否在原始代码中添加了 \

urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' \
              + stock + '/chartdata;type=quote;range=5d/csv'
如果您省略它,它可能会成为异常的原因:
>>> stock = 'GOOG'
>>> urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/'
>>> + stock + '/chartdata;type=quote;range=5d/csv'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for unary +: 'str'

顺便说一下,string(e) 应该改为 str(e)


感谢您的反馈falsetru,我去掉了\,但仍然收到操作数错误。我想不出来怎么解决。程序可以工作,但我担心操作数错误会在后面引起更多问题,它一直在if int(splitLine[0]) > int(lastUnix):这一行触发。我会继续寻找解决方法,再次感谢!另外,我注意到提交后立即发现我实际上写了string(e),呃! - heinztomato
1
@heinztomato,请在您的问题中更新完整的回溯信息。 - falsetru
抱歉耽搁了,这里是完整的代码和运行程序后的响应。看起来它成功输出了“Pulled”,但操作数问题返回了而不是股票,然后循环进入下一个输入。有什么想法吗?再次感谢您的帮助。 - heinztomato
@heinztomato,请移除 try... except ...,重新运行程序并更新问题,附上完整的回溯信息try ... except .., e: print(e) 无法显示完整的回溯信息。 - falsetru
添加\解决了我的问题。我更多地使用Java进行工作,这是跨语言编程的一个陷阱。看着我拥有的多行字符串连接,Python语法与Java的这个小差异逃脱了我的注意。 - NurShomik

3

我遇到了相同的错误信息,但原因不同。三引号后面有一个回车是问题所在。

在Python 3中:

final_sentence="""Pulled
"""+stock+""".""" 
print (final_sentence)

可以工作,但不是:

final_sentence="""Pulled"""
+stock+""".""" 
print (final_sentence)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接