ValueError: int() 以 10 为底的无效文字:''

Posted

技术标签:

【中文标题】ValueError: int() 以 10 为底的无效文字:\'\'【英文标题】: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 【参考方案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)
    在这里,您尝试将字符串转换为非 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 中肯定是糟糕的设计。

【讨论】:

以上是关于ValueError: int() 以 10 为底的无效文字:''的主要内容,如果未能解决你的问题,请参考以下文章

ValueError: int() 以 10 为底的无效文字:'10025.0'

ValueError:int() 的无效文字,以 10 为底错误

ValueError: int() 以 10 为底的无效文字:'196.41'

用户输入给出“ValueError:int() 以 10 为底的无效文字:”

如何修复:ValueError:long() 以 10 为底的无效文字

Django 管理员,自定义视图错误:int() 以 10 为底的无效文字