web-dev-qa-db-fra.com

Type d'opérande incorrect pour unaire +: 'str'

Je ne peux pas comprendre un problème que j'ai avec le code écrit en Python 2.7. Je convertis les références en ints, mais je reçois toujours une exception de type bad operand type for unary +: 'str'. Quelqu'un peut-il aider ?

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)

Je frappe l'exception d'opérande bad operand type for unary +: 'str' Quand il arrive à if int(splitLine[0]) > int(lastUnix): même si les deux valeurs comparées s'impriment comme des entiers lors du test. quelqu'un peut-il me donner des commentaires? Je vous remercie!

voici la réponse d'exception:

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'`
24
heinztomato

Vous dites que if int(splitLine[0]) > int(lastUnix): est à l'origine du problème, mais vous ne montrez en fait rien qui suggère cela. Je pense que cette ligne est le problème à la place:

print 'Pulled', + stock

Voyez-vous pourquoi cette ligne pourrait provoquer ce message d'erreur? Vous voulez soit

>>> stock = "AAAA"
>>> print 'Pulled', stock
Pulled AAAA

ou

>>> print 'Pulled ' + stock
Pulled AAAA

ne pas

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

Vous demandez Python d'appliquer le + symbole d'une chaîne comme +23 fait un 23 positif et elle objecte.

27
DSM

Le code fonctionne pour moi. (après l'ajout des clauses except/import manquantes)

Avez-vous mis \ Dans le code d'origine?

urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' \
              + stock + '/chartdata;type=quote;range=5d/csv'

Si vous l'omettez, cela pourrait être une cause de l'exception:

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

BTW, string(e) doit être str(e).

5
falsetru