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