【问题标题】:Python invalid literal for int() with base 10: '.'以 10 为底的 int() 的 Python 无效文字:'.'
【发布时间】:2015-04-23 18:18:29
【问题描述】:

我是一个初学者,我正在尝试获取文件每一行的最后一个元素的总和。谁能告诉我出了什么问题?

def sumLastElement(file):    
    f = open(file, "r").read()
    evenNumbers = []    
    for line in f:
        lastElement = line[-1]
        if int(lastElement):
            try:
                lastElement % 2 == 0
                evenNumbers.append(lastElement)
            except:
                pass    
    return sum(evenNumbers)
    f.close()

【问题讨论】:

  • . 无法解析为int
  • 我也试过 if type(lastElement) == int: 但没用。
  • 显示输入行。在不知道您要解析的内容的情况下,无法为您提供帮助
  • lastElement 将永远是一个字符串,所以这永远不会工作。我认为你无意中切换了 tryif 语句 - 交换它们,你的逻辑是有道理的。
  • 忘了告诉我我正在尝试获取文件每一行的偶数之和。函数调用:result = sumLastElement("filename")

标签: python list function int


【解决方案1】:
  1. 您尝试在以下语句中将字符串字符转换为整数

    int(lastElement)

  2. 您的代码中只有print 变量lastElement 的值

    例如print "Value of lastElement:-", lastElement

  3. lastElement % 2 == 0 将不起作用,因为 lastElement 变量的类型在 string 中,因此此语句将引发 TypeError 异常。

  4. return 语句之后不会运行任何语句,在代码文件中 f.close()return 语句之后关闭。

  5. 使用if循环检查%操作的结果是否等于0lastElement % 2 == 0 这将返回 True 或 False 值,因此每个 lastElement 都将附加到列表中

例如

>>> if lastElement % 2 == 0:
...   evenNumbers.append(lastElement)

例如异常

>>> int("a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'
>>> int("5")
5
>>> 

使用异常处理捕获值错误:-

>>> try:
...   lastElement = int(line[-1])
... except ValueError:
...   print "Exception during type casting for input %s"%(line[-1])
...   continue

【讨论】:

    【解决方案2】:

    您的代码中有几个问题。

    首先,永远不会到达f.close(),因为上面的return 将退出该函数。如果您开始使用with open() as instead 可能会更好(完成后它会自动关闭文件)。

    处理文件时最好使用with 关键字 对象。这样做的好处是文件在之后正确关闭 它的套件完成了,即使在途中引发了异常。

    其次,如果一行中的最后一个字符无法转换为 int,则将引发 ValueError

    使用try: 时,您应该只处理您预期的错误。所有其他错误都应通过您的代码传播,以便您知道何时出现问题。


    以下是您的代码的改进版本。

    def sumLastElement(file):
    
        with open(file, 'r') as opened_file:
            evenNumbers = []
    
            for line in opened_file:
                lastElement = line.replace('\n', '')[-1]
    
                try:
                    element_as_int = int(lastElement)
                    if element_as_int % 2 == 0:
                        evenNumbers.append(element_as_int)
                except ValueError:
                    pass
    
            return sum(evenNumbers)
    

    要每行捕获多个连续数字,我宁愿使用regular expressions

    import re
    
    
    def sumLastElement(file):
    
        with open(file, 'r') as opened_file:
            evenNumbers = []
    
            for line in opened_file:
    
                lst_of_matches = re.findall(r'\d+$', line)
                if lst_of_matches:
                    matched_as_int = int(lst_of_matches[-1])
                    if matched_as_int % 2 == 0:
                        evenNumbers.append(matched_as_int)
            return sum(evenNumbers)
    

    r'\d+$' 是您在line 字符串中搜索的模式。 r'blabla' 是一个原始字符串,\d 表示一个数字,+ 表示前面的一个或多个(即一个或多个\d),最后$ 匹配行尾。

    【讨论】:

    • 谢谢!!!这很好用。只是为了我的学习,您能否也帮我编写代码,该代码返回每行末尾的所有偶数之和,无论有多少位如下? (如果你有时间,当然愿意) t0gad9 #pass eoti30gro4930 #get 4930 sdgklj220r458dl0.8 #pass nr6546% #pass dlgkj40.0 #get 40.0(或40)09gg0 #get 0 还有一件事,我应该在哪里包括“f.close()”?或者如果你使用“with”语句是不是没有必要?
    • @momo with 会自动关闭文件,因此不需要.close()。我添加了新代码来捕获多个连续数字,因为调整以前的代码似乎过于复杂。
    【解决方案3】:

    您正在尝试在以下行将字符串转换为整数:

    if int(lastElement)
    

    所以它给出了错误。您可以将此行放在 try 块中以消除错误。

     def sumLastElement(file):    
        f = open(file, "r").read()
        evenNumbers = []    
        for line in f:
            lastElement = line[-1]
    
              try:
                 if int(lastElement):
                    lastElement % 2 == 0
                    evenNumbers.append(lastElement)
              except:
                    pass    
        return sum(evenNumbers)
        f.close()
    

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多