convert string number to real number - ValueError: invalid literal for int() with base 10: '"2"'
Larry Bates
larry.bates at websafe.com
Thu Feb 28 18:49:18 EST 2008
davidj411 wrote:
> i am parsing a cell phone bill to get a list of all numbers and the
> total talktime spend on each number.
>
> i already have a unique list of the phone numbers.
> now i must go through the list of numbers and add up the totals for
> each number.
> on the bill, each line has a few fields,one field containing the phone
> number, another field containing the number of minutes on that call.
> the bill is comma delimited.
>
> here is the function i wrote to get one number at a time's total
> talktime.
>
> def getsinglenumbertalktime(number,talktime):
> for line in file[0:-2]:
> if number in line:
> li=line.split(',')
> if len(li)==6 and li[5]!="Minutes" :
> print "talktime type: " + str(type (talktime))
> #li[5]=fpformat.fix(li[5],0)
>
> print li[5] + "li[5] type: " + str(type(li[5]))
> newvar = int(li[5])
> print (type(newvar))
> print li[5]
> talktime = talktime + li[5]
> return talktime
>
> here is the output with error that i get back.
>
> talktime type: <type 'int'>
> "2"li[5] type: <type 'str'>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "c:\path\inprog\all_t_mob_nums.py", line 74, in <module>
> getsinglenumbertalktime('"800-218-2644"',talktime)
> File "c:\path\inprog\all_t_mob_nums.py", line 66, in
> getsinglenumbertalktime
> newvar = int(li[5])
> ValueError: invalid literal for int() with base 10: '"2"'
>
>
> here is the question:
>
> How can i convert a string number like "2" to a true number that can
> be added.
> I have tried using pfformat, float(), and int() - all with no good
> results.
> this seems like is should be simple, but it just plain isn't.
>
>
> I actually found a good solution.
> basically, take each entry and add it to a list.
> then iterate through the list , converting each item to int().
> then add them to sum them all up.
>
> FINAL SOLUTION:
> def getsinglenumbertalktime(number,talktime):
> num_of_calls=0
> num_mins=[]
> for line in file[0:-2]:
> #print "LINE: " + line
> #print number in line
> if number in line:
> num_of_calls += 1
> #print number,num_of_calls
> li=line.strip("\n")
> #print "stripped:" + line
> li=li.split(',')
> #print "split: " + str(li)
> #print "len of li: " + str(len(li)) + str(num_of_calls)
> if len(li)==7 and li[5]!="Minutes" :
> #print "talktime type: " + str(type (talktime))
> #print li[4] + "li[4] type: " + str(type(li[5]))
> #newvar = fpformat.fix(li[4],0)
> #print (type(newvar))
> #print "len 7: " + str(type(li[6]))
> num_mins.append(li[6])
> #talktime = talktime + int(a)
>
> if len(li)==6 and li[5]!="Minutes" :
> #print "talktime type: " + str(type (talktime))
> #print li[5] + "li[5] type: " + str(type(li[5]))
> #newvar = fpformat.fix(li[4],0)
> #print (type(newvar))
> #print "len 6: " + str(type(li[5]))
> num_mins.append(li[5])
> #talktime = talktime + int(a)
> #return talktime , num_of_calls
> x=0
> #print "this" + str(number) + str(num_mins)
> for a in num_mins:
> b=int(a)
> x=x+b
> print str(number), str(x), str(type(x))
>
> output should look like this (parts of script are not included)
> 555-555-5555 replaced the innocent :P):
> 555-555-5555 19 <type 'int'>
> 555-555-5555 6 <type 'int'>
> 555-555-5555 3 <type 'int'>
> 555-555-5555 3 <type 'int'>
> 555-555-5555 2 <type 'int'>
> 555-555-5555 52 <type 'int'>
If the file is quote and comma delimited, you should be using the csv module to
do your reading and stripping of the quotes. Should make things MUCH easier.
-Larry
More information about the Python-list
mailing list