convert string number to real number - ValueError: invalid literal

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • davidj411

    #1

    convert string number to real number - ValueError: invalid literal

    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 getsinglenumber talktime(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(l i[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>
    getsinglenumber talktime('"800-218-2644"',talktime )
    File "c:\path\inprog \all_t_mob_nums .py", line 66, in
    getsinglenumber talktime
    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 getsinglenumber talktime(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_c alls
    li=line.strip(" \n")
    #print "stripped:" + line
    li=li.split(',' )
    #print "split: " + str(li)
    #print "len of li: " + str(len(li)) + str(num_of_call s)
    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'>
  • D'Arcy J.M. Cain

    #2
    Re: convert string number to real number - ValueError: invalid

    On Thu, 28 Feb 2008 14:56:10 -0800 (PST)
    davidj411 <davidj411@gmai l.comwrote:
    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.
    You have to get rid of the double quotes first.

    --
    D'Arcy J.M. Cain <darcy@druid.ne t | Democracy is three wolves
    http://www.druid.net/darcy/ | and a sheep voting on
    +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.

    Comment

    • Larry Bates

      #3
      Re: convert string number to real number - ValueError: invalid literal

      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 getsinglenumber talktime(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(l i[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>
      getsinglenumber talktime('"800-218-2644"',talktime )
      File "c:\path\inprog \all_t_mob_nums .py", line 66, in
      getsinglenumber talktime
      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 getsinglenumber talktime(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_c alls
      li=line.strip(" \n")
      #print "stripped:" + line
      li=li.split(',' )
      #print "split: " + str(li)
      #print "len of li: " + str(len(li)) + str(num_of_call s)
      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

      Comment

      • SPGIMail@gmail.com

        #4
        Re: convert string number to real number - ValueError: invalid

        You have to get rid of the double quotes first.
        you mean replace them with nothing?

        li[4].replace('"','' )

        once i do that, i should be able to use them as numbers.

        Comment

        • Terry Reedy

          #5
          Re: convert string number to real number - ValueError: invalid


          "davidj411" <davidj411@gmai l.comwrote in message
          news:3ca86e1d-a32f-48f2-bc9a-6cb792c0c631@z1 7g2000hsg.googl egroups.com...
          |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.

          | here is the function i wrote to get one number at a time's total
          | talktime.
          |
          | def getsinglenumber talktime(number ,talktime):
          | for line in file[0:-2]:
          ....
          | | talktime = talktime + li[5]
          | return talktime

          It would appear that you are calling this function and rescanning scanning
          file for each number. It would be more efficient to scan the file once,
          for each line parsing out the number and minutes and incrementing the
          minutes for that number.

          Also, if you had printed repr(li[5]) and len(li[5]) instead of or in
          addition to just li[5] (which prints str(li[5]),
          >>a='"2"'
          >>print a, repr(a), len(a)
          "2" '"2"' 3

          you might have seen for yourself the problem that the string contains quote
          marks and not just digits. Repr and len are useful debugging aids.

          tjr



          Comment

          • D'Arcy J.M. Cain

            #6
            Re: convert string number to real number - ValueError: invalid

            On Fri, 29 Feb 2008 13:32:15 -0800 (PST)
            "SPGIMail@gmail .com" <SPGIMail@gmail .comwrote:
            >
            You have to get rid of the double quotes first.
            >
            you mean replace them with nothing?
            >
            li[4].replace('"','' )
            Sure, that will do. However, look at the csv module for another way of
            handling this.
            once i do that, i should be able to use them as numbers.
            You still need to apply int() or float() to the result.

            --
            D'Arcy J.M. Cain <darcy@druid.ne t | Democracy is three wolves
            http://www.druid.net/darcy/ | and a sheep voting on
            +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.

            Comment

            • George Sakkis

              #7
              Re: convert string number to real number - ValueError: invalid

              On Feb 28, 5:56 pm, davidj411 <davidj...@gmai l.comwrote:
              i am parsing a cell phone bill to get a list of all numbers and the
              total talktime spend on each number.
              >
              (snipped)
              >
              I actually found a good solution.
              (snipped)
              If you post 1-2 samples of the cell phone bill input, I am sure you'll
              get much better solutions in terms of clarity, simplicity and
              elegance, commonly known as "pythonicit y" :)

              George

              Comment

              • Gabriel Genellina

                #8
                Re: convert string number to real number - ValueError: invalid

                En Tue, 27 May 2008 13:00:05 -0300, David Jackson <davidj411@gmai l.com>
                escribió:
                i used the csv module and saved its contents to a list.
                >
                ['Date', 'No.', 'Description', 'Debit', 'Credit']
                ['3/17/2006', '5678', 'ELECTRONIC PAYMENT', '', '11.45']
                ['3/04/2007', '5678', 'THE HOME DEPOT 263 SomeCity FL', '', '25.40']
                >
                >
                the credit/debit fields are strings.
                what should i have done within the CSV module to make numbers appear as
                numbers?
                how can i remove the quotes to make them numbers? i realize i posted a
                solution to this once before (same posting thread) but i am thinking
                there
                is a better method.
                What do you want to do with those empty strings? Convert them to zeros?
                Suppose your list is named `rows`:

                for i,row in enumerate(rows) :
                if not i: continue # skip titles
                row[3] = float(row[3] or 0)
                row[4] = float(row[4] or 0)

                --
                Gabriel Genellina

                Comment

                • Kam-Hung Soh

                  #9
                  Re: convert string number to real number - ValueError: invalid

                  David Jackson wrote:
                  i used the csv module and saved its contents to a list.
                  >
                  ['Date', 'No.', 'Description', 'Debit', 'Credit']
                  ['3/17/2006', '5678', 'ELECTRONIC PAYMENT', '', '11.45']
                  ['3/04/2007', '5678', 'THE HOME DEPOT 263 SomeCity FL', '', '25.40']
                  >
                  >
                  the credit/debit fields are strings.
                  what should i have done within the CSV module to make numbers appear as
                  numbers?
                  how can i remove the quotes to make them numbers? i realize i posted a
                  solution to this once before (same posting thread) but i am thinking
                  there is a better method.
                  There doesn't seem to be a way to describe how specific columns should
                  be processed in the csv module. You could define a conversion function
                  that "guesses" the best conversion, for example:

                  def str2num(datum):
                  try:
                  return int(datum)
                  except:
                  try:
                  return float(datum)
                  except:
                  return datum

                  for row in csv.reader(file (r'Transaction. csv')):
                  [str2num(cell) for cell in row]

                  ['Date', 'No.', 'Description', 'Debit', 'Credit']
                  ['3/17/2006', 5678, 'ELECTRONIC PAYMENT', '', 11.449999999999 999]
                  ['3/04/2007', 5678, 'THE HOME DEPOT 263 SomeCity FL', '',
                  25.399999999999 999]

                  --
                  Kam-Hung Soh <a href="http://kamhungsoh.com/blog">Software Salariman</a>

                  Comment

                  • davidj411

                    #10
                    Re: convert string number to real number - ValueError: invalid

                    On May 28, 2:22 am, Kam-Hung Soh <kamhung....@gm ail.comwrote:
                    David Jackson wrote:
                    i used the csv module and saved its contents to a list.
                    >
                    ['Date', 'No.', 'Description', 'Debit', 'Credit']
                    ['3/17/2006', '5678', 'ELECTRONIC PAYMENT', '', '11.45']
                    ['3/04/2007', '5678', 'THE HOME DEPOT 263 SomeCity FL', '', '25.40']
                    >
                    the credit/debit fields are strings.
                    what should i have done within the CSV module to make numbers appear as
                    numbers?
                    how can i remove the quotes to make them numbers? i realize i posted a
                    solution to this once before (same posting thread) but i am thinking
                    there is a better method.
                    >
                    There doesn't seem to be a way to describe how specific columns should
                    be processed in the csv module.  You could define a conversion function
                    that "guesses" the best conversion, for example:
                    >
                    def str2num(datum):
                            try:
                                    return int(datum)
                            except:
                                    try:
                                            return float(datum)
                                    except:
                                            return datum
                    >
                    for row in csv.reader(file (r'Transaction. csv')):
                            [str2num(cell) for cell in row]
                    >
                    ['Date', 'No.', 'Description', 'Debit', 'Credit']
                    ['3/17/2006', 5678, 'ELECTRONIC PAYMENT', '', 11.449999999999 999]
                    ['3/04/2007', 5678, 'THE HOME DEPOT 263 SomeCity FL', '',
                    25.399999999999 999]
                    >
                    --
                    Kam-Hung Soh <a href="http://kamhungsoh.com/blog">Software Salariman</a>
                    I like the str2num function approach, but then i get left with a float
                    that has more than 2 decimal spaces , i.e. 11.50 becomes
                    11.449999999999 999 and round will not fix that.

                    Comment

                    • Matthias =?iso-8859-1?q?Bl=E4sing?=

                      #11
                      Re: convert string number to real number - ValueError: invalid

                      Am Wed, 28 May 2008 10:41:51 -0700 schrieb davidj411:
                      I like the str2num function approach, but then i get left with a float
                      that has more than 2 decimal spaces , i.e. 11.50 becomes
                      11.449999999999 999 and round will not fix that.
                      Welcome to the wonderful world of floating point numbers. For your usage
                      you want 10-based numbers. Have a look at the decimal module:
                      >>from decimal import Decimal
                      >>a = Decimal("11.45" )
                      >>a
                      Decimal("11.45" )
                      >>str(a)
                      '11.45'
                      >>a + 1
                      Decimal("12.45" )
                      >>a + Decimal("1.55")
                      Decimal("13.00" )

                      HTH

                      Matthias

                      Comment

                      • Kam-Hung Soh

                        #12
                        Re: convert string number to real number - ValueError: invalid

                        Matthias Bläsing wrote:
                        Am Wed, 28 May 2008 10:41:51 -0700 schrieb davidj411:
                        >
                        >I like the str2num function approach, but then i get left with a float
                        >that has more than 2 decimal spaces , i.e. 11.50 becomes
                        >11.44999999999 9999 and round will not fix that.
                        >
                        Welcome to the wonderful world of floating point numbers. For your usage
                        you want 10-based numbers. Have a look at the decimal module:
                        >
                        >>>from decimal import Decimal
                        >>>a = Decimal("11.45" )
                        >>>a
                        Decimal("11.45" )
                        >>>str(a)
                        '11.45'
                        >>>a + 1
                        Decimal("12.45" )
                        >>>a + Decimal("1.55")
                        Decimal("13.00" )
                        >
                        HTH
                        >
                        Matthias
                        --

                        >
                        Thanks for the tip, Matthias. I knew that there had to be a way to
                        handle arbitrary precision numbers.

                        --
                        Kam-Hung Soh <a href="http://kamhungsoh.com/blog">Software Salariman</a>

                        Comment

                        Working...