2013-12-15 21 views
13

Non riesco a capire un problema che sto avendo con il codice scritto in Python 2.7. Sto convertendo i riferimenti in pollici, ma continuo a ricevere un'eccezione di tipo bad operand type for unary +: 'str'. Qualcuno può aiutare?Tipo di operando errato per unario +: '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) 

sto colpendo l'eccezione operando bad operand type for unary +: 'str' quando si arriva al if int(splitLine[0]) > int(lastUnix): anche se entrambi i valori a confronto di stampa come interi durante il test. qualcuno può darmi un feedback? grazie!

Ecco la risposta di eccezione:

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'` 
+2

Non limitarti a rilevare un'eccezione per stamparla, perché perdi la traccia dello stack! – Eric

risposta

16

Si dice che if int(splitLine[0]) > int(lastUnix): stia causando il problema, ma in realtà non si mostra nulla che lo suggerisca. Credo che questa linea è il problema invece:

print 'Pulled', + stock 

Capite perché questa linea potrebbe causare il messaggio di errore? Si vuole sia

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

o

>>> print 'Pulled ' + stock 
Pulled AAAA 

non

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

Stai chiedendo Python di apporre il simbolo + ad una stringa come +23 fa una positiva 23 e lei di obiezioni.

+0

grazie per il feedback, il brutto passo falso da parte mia e mi scuso per la disdetta con questo. Apprezzo il tuo aiuto, passo un po 'a guardare la cosa sbagliata! :( – heinztomato

2

Il codice funziona per me. (dopo aver aggiunto la mancanza except clausola/import dichiarazioni)

Hai inserito \ nel codice originale?

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

Se si omette di esso, potrebbe essere una causa di esclusione:

>>> 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) dovrebbe essere str(e).

+0

grazie per il tuo feedback falsetru, ho preso il \ out e sto ancora ricevendo l'errore dell'operando. Non riesco a capirlo. Il programma funziona ma temo che l'errore dell'operando causerà più problemi lungo la linea, continua a triggerare in "if int (splitLine [0])> int (lastUnix):" line. continuo a cercare la soluzione, grazie ancora! inoltre, ho notato subito dopo aver inviato che ho letteralmente scritto string (e), doh! – heinztomato

+1

@heinztomato, Si prega di aggiornare la domanda con il traceback completo. – falsetru

+0

scusa per il ritardo, ecco il codice completo e la risposta dopo aver eseguito il programma. sembra farlo stampare 'Pulled' ma il problema dell'operando sta ritornando invece del grezzo, quindi il loop passa al prossimo input. qualche idea? Grazie ancora per il vostro aiuto. – heinztomato

Problemi correlati