【问题标题】:ValueError: invalid literal for int() with base 10: ''ValueError: int() 以 10 为底的无效文字:''
【发布时间】:2010-12-22 22:19:49
【问题描述】:

我正在创建一个读取文件的程序,如果文件的第一行不是空白,它会读取接下来的四行。在这些行上执行计算,然后读取下一行。如果该行不为空,则继续。但是,我收到此错误:

ValueError: invalid literal for int() with base 10: ''.

它正在读取第一行,但无法将其转换为整数。

我可以做些什么来解决这个问题?

代码:

file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
    infile = open(file_to_read, 'r')
    while file_to_read != " ":
        file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
        file_to_write = file_to_write + ".csv"
        outfile = open(file_to_write, "w")
        readings = (infile.readline())
        print readings
        while readings != 0:
            global count
            readings = int(readings)
            minimum = (infile.readline())
            maximum = (infile.readline())

【问题讨论】:

  • 你应该考虑在那里使用with open(file_to_read, 'r') as infile:
  • 适用于目前正在查看这里的任何人。错误可能是其中一行不是整数形式。例如:“是”的格式不正确,但“3”的格式正确。对于这个问题,第一行可能没有任何 "1"s、"2"s、"3"s... 来转换为 int。
  • 当输入字符串的数字之间有空格时出现此错误。此错误基本上意味着您的输入字符串对于字符串到整数的转换无效。对于转换,您的字符串应仅且仅包含以下字符:+-.0123456789

标签: python


【解决方案1】:

我对这个问题的简单解决方法是将我的代码包装在 if 语句中,利用空字符串 is not "truthy":

给定这两个输入中的任何一个:

input_string = ""    # works with an empty string
input_string = "25"  # or a number inside a string

您可以使用此检查安全地处理空白字符串:

if input_string:
   number = int(input_string)
else:
   number = None # (or number = 0 if you prefer)

print(number)

【讨论】:

    【解决方案2】:

    我希望这对在 Django 中遇到此错误的未来访问者有所帮助,曾经在我的模型中,我有一个 DateTimeField(),上面有一些保存的对象。 然后当我将字段更改为DateField() 我遇到了这个错误

    要解决这只是编辑了我的数据库(db.sqlite3),因为我将日期值从 2021-08-09 13:05:45 格式更改为 2021-08-09,仅此而已。

    【讨论】:

      【解决方案3】:

      如果上述所有解决方案都不适合您,请提供另一个答案。

      我的原始错误类似于 OP:ValueError: invalid literal for int() with base 10: '52,002'

      然后我尝试了接受的答案并得到了这个错误:ValueError: could not convert string to float: '52,002' --这是我尝试 int(float(variable_name)) 的时候 p>

      我的解决方案是将字符串转换为浮点数并将其保留在那里。我只需要检查字符串是否为数值,以便正确处理。

      try: 
         float(variable_name)
      except ValueError:
         print("The value you entered was not a number, please enter a different number")
      

      【讨论】:

        【解决方案4】:

        仅作记录:

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

        找我...

        >>> int(float('55063.000000'))
        55063
        

        必须使用!

        【讨论】:

        • 我将补充一点,以便为将来的读者提供更清晰的信息,确实,当 int('1.0') 抛出 ValueError 时, int(float('1.0')) 有效。
        • 这应该是这个问题的公认最佳答案。我几乎关闭了页面并没有看到它。谢谢!
        • 添加到答案 int(float('55063.000000')) 因为问题是 get int()。比它真正的最佳答案
        • 这个答案似乎与这个问题没有任何关系。问题是当您在空字符串上调用 int() 时,如何防止出现 ValueError 。 “改用 float()”并不能解决这个问题。你仍然会得到一个 ValueError。
        • 当我根据上面的答案将字符串转换为浮点数时,它说ValueError: could not convert string to float:
        【解决方案5】:

        你的答案是因为这条线而引发错误

        readings = int(readings)
        
        1. 在这里,您尝试将字符串转换为非 base-10 的 int 类型。只有当它是 base-10 时,您才能将字符串转换为 int,否则它会抛出 ValueError,说明 int() 以 10 为底的无效文字。

        【讨论】:

          【解决方案6】:

          我很难找出真正的原因,当我们没有从文件中正确读取时就会发生这种情况。 您需要打开文件并使用 readlines() 方法读取如下:

          with open('/content/drive/pre-processed-users1.1.tsv') as f:
              file=f.readlines()
          

          它更正格式化的输出

          【讨论】:

            【解决方案7】:

            原因是你得到一个空字符串或一个字符串作为 int 的参数。检查它是否为空或包含字母字符。如果它包含字符,则直接忽略该部分。

            【讨论】:

            • 这看起来更像是一条评论。当您有足够的声誉时,您将能够对任何帖子发表评论。
            • 这正是我所需要的,谢谢。我不明白为什么这个论坛上的人如此痴迷于微管理这个网站
            【解决方案8】:

            这似乎读数有时是一个空字符串,显然会出现错误。 您可以在 int(readings) 命令之前向 while 循环添加额外的检查,例如:

            while readings != 0 | readings != '':
                global count
                readings = int(readings)
            

            【讨论】:

              【解决方案9】:

              我最近遇到了一个案例,这些答案都不起作用。我遇到了 CSV 数据,其中有空字节与数据混合,并且这些空字节没有被剥离。因此,我的数字字符串在剥离后由如下字节组成:

              \x00\x31\x00\x0d\x00
              

              为了解决这个问题,我做了:

              countStr = fields[3].replace('\x00', '').strip()
              count = int(countStr)
              

              ...其中 fields 是拆分行产生的 csv 值列表。

              【讨论】:

              • 你先生是个天才!谢谢
              • 你是我的英雄!谢谢!
              【解决方案10】:

              如果你有

              floatInString = '5.0'
              

              您可以使用floatInInt = int(float(floatInString)) 将其转换为int

              【讨论】:

                【解决方案11】:

                我找到了解决办法。 Python 会将数字转换为浮点数。只需先调用 float 然后将其转换为 int 即可: output = int(float(input))

                【讨论】:

                • 这个答案不等于@FdoBad给出的答案吗?
                【解决方案12】:

                我在尝试在 for 循环中为同一个文件对象使用 readlines() 时遇到了同样的问题...我怀疑是在 readline() 中为同一个文件对象触发 readling() 导致了这个错误。

                最好的解决方案是使用 seek(0) 重置文件指针或 通过设置一些标志来处理条件,然后通过检查设置条件为同一文件创建新对象....

                【讨论】:

                  【解决方案13】:

                  以下在python中是完全可以接受的:

                  • 将整数的字符串表示形式传递给int
                  • 将浮点数的字符串表示形式传递给float
                  • 将整数的字符串表示形式传递给float
                  • 将浮点数传递给int
                  • 将整数传递给float

                  但是,如果您将 float 的字符串表示形式传递给 int,或者除整数以外的任何字符串表示形式(包括空字符串),您将得到 ValueError。如果您确实想将浮点数的字符串表示形式传递给int,正如上面@katyhuff 指出的那样,您可以先转换为浮点数,然后再转换为整数:

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

                  【讨论】:

                  • 这个答案似乎与这个问题没有任何关系。问题是询问当您在空字符串上调用 int() 时如何防止出现 ValueError 。 “改用 float()”并不能解决这个问题。你仍然会得到一个 ValueError。
                  • @Kevin 尽管这并不能直接回答 OP 的问题。但是,它确实可以帮助有此问题且不介意int(float(x)) 的人。因为这是搜索此错误时弹出的第一个问题。
                  • 哇,这太愚蠢了。为什么不让 int() 接受一个字符串?这正是我所期望的,而不是先将其类型转换为 float .....
                  • 至少在我的情况下,类型转换为浮点数不起作用.. 显示的错误是无法将 int 转换为浮点数
                  【解决方案14】:

                  您收到此错误的原因是您试图将空格字符转换为整数,这是完全不可能且受限制的。这就是您收到此错误的原因。

                  检查您的代码并更正它,它会正常工作

                  【讨论】:

                    【解决方案15】:

                    当您必须将空格分隔的整数映射到列表但您使用.input() 逐行输入整数时,也会发生这种情况。 例如,我在 HackerRank Bon-Appetit 上解决了这个问题,编译时出现以下错误

                    因此,与其逐行向程序提供输入,不如尝试使用map() 方法将空格分隔的整数映射到一个列表中。

                    【讨论】:

                      【解决方案16】:

                      请在一个简单文件上测试此功能 (split())。我也遇到了同样的问题,发现是因为split()没有写好(异常处理)。

                      【讨论】:

                        【解决方案17】:

                        我遇到了类似的错误,原来数据集有空白值,python 无法将其转换为整数。

                        【讨论】:

                        • 您能否通过一些示例详细说明 OP 如何解决它?
                        • 空值表示空值,可以转换为字符串浮点数。如果您尝试转换为 float 也会显示错误
                        【解决方案18】:

                        遍历文件并转换为 int 的 Pythonic 方式:

                        for line in open(fname):
                           if line.strip():           # line contains eol character(s)
                               n = int(line)          # assuming single integer on each line
                        

                        您尝试做的事情稍微复杂一些,但仍然不是直截了当:

                        h = open(fname)
                        for line in h:
                            if line.strip():
                                [int(next(h).strip()) for _ in range(4)]     # list of integers
                        

                        这样它一次处理 5 行。在 Python 2.6 之前使用 h.next() 而不是 next(h)

                        您之所以拥有ValueError 是因为int 无法将空字符串转换为整数。在这种情况下,您需要在转换之前检查字符串的内容,或者排除错误:

                        try:
                           int('')
                        except ValueError:
                           pass      # or whatever
                        

                        【讨论】:

                        • 您的 try/except 无法区分合理预期的内容(空白/空行)和非整数等令人讨厌的内容。
                        • 你为什么要区分这些东西?
                        • 因为一个是可以合理预期和忽略的,但另一个是错误的指示
                        • 为什么空行是可以合理预期的,而非整数则不是?
                        • 如果您确定您的列表实际上是一个字符串化整数列表,这很好。如果你不确定你可以做n = int(line) if line.is_integer() else int(float(line))
                        【解决方案19】:

                        这行有问题:

                        while file_to_read != " ":
                        

                        这找不到空字符串。它找到一个由一个空格组成的字符串。大概这不是您想要的。

                        听取其他人的建议。这不是非常惯用的python代码,如果直接遍历文件会更清晰,但我认为这个问题也值得注意。

                        【讨论】:

                          【解决方案20】:

                          我正在创建一个读取 文件,如果文件的第一行 不是空白的,它读取接下来的四个 线。计算是在 这些行,然后下一行是 阅读。

                          这样的事情应该可以工作:

                          for line in infile:
                              next_lines = []
                              if line.strip():
                                  for i in xrange(4):
                                      try:
                                          next_lines.append(infile.next())
                                      except StopIteration:
                                          break
                              # Do your calculation with "4 lines" here
                          

                          【讨论】:

                            【解决方案21】:
                                readings = (infile.readline())
                                print readings
                                while readings != 0:
                                    global count
                                    readings = int(readings)
                            

                            该代码有问题。 readings 是从文件中读取的新行 - 它是一个字符串。因此,您不应将其与 0 进行比较。此外,您不能只将其转换为整数,除非您 确定 它确实是 1。例如,空行会在此处产生错误(您肯定已经发现)。

                            为什么需要全局计数?这在 Python 中肯定是糟糕的设计。

                            【讨论】:

                              猜你喜欢
                              • 2018-09-09
                              • 2020-01-04
                              • 2011-07-07
                              • 2019-10-14
                              • 2022-05-19
                              • 2013-05-07
                              相关资源
                              最近更新 更多