【问题标题】:Value Error : invalid literal for int() with base 10: ''值错误:以 10 为基数的 int() 的无效文字:''
【发布时间】:2013-07-17 15:57:59
【问题描述】:

我是 Python 新手,不知道为什么有时会出现此错误。

这是代码:

import random
sorteio = []
urna = open("urna.txt")

y = 1
while y <= 50:
    sort = int(random.random() * 392)
    print sort
    while sort > 0:
        x = urna.readline()
        sort = sort - 1
    print x  
    sorteio = sorteio + [int(x)]
    y = y + 1
print sorteio

urna.txt 是这种格式的文件:

1156
459
277
166
638
885
482
879
33
559

如果有人知道为什么会出现此错误以及如何修复它,我将不胜感激。

【问题讨论】:

  • 您的目标是读取文本文件并仅对值的随机部分进行排序吗?你知道你只存储你读出的最后一个值吗?
  • 是的,但我坚持认为“sorteio = sorteio + [int(x)]”将所有值存储在一个列表中......我该如何存储所有值?
  • 您能告诉我while &lt;= 50 的意义何在吗?您能否发布您的预期输出,这将有助于解决您的问题
  • 我必须随机选择 50 个数字 urna.txt 文件(每个代表 db 中的一个 id)并将它们存储在一个列表中,然后检索每个 id 的数据并打印它们
  • 我想我刚刚发现了另一个问题:随机搜索必须每次都在整个文件中,但我编写下一个循环的方式将在文件的较小部分,对吗?

标签: python python-2.7


【解决方案1】:

在尝试读取文件末尾之后,您会得到一个空字符串 '',它无法转换为 int。

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

如果我正确理解您的问题,满足从文本值中随机选择 50 行的要求:

import random

with open("urna.txt") as urna:
    sorteio = [int(line) for line in urna] # all lines of the file as ints

selection = random.sample(sorteio, 50)

print selection

【讨论】:

  • random.sample 将是一种更直接的方式来获取特定数量的随机选择的项目。
  • 一般来说,使用for 循环来循环文件的行要容易得多。 Ryan 的答案使用包含 for 循环的列表理解,但您也可以将其写为 for line in file:,就像其他 for 循环一样。仅供参考。
【解决方案2】:

.readline() 到达文件末尾时返回一个空字符串,这不是一个有效数字。

测试一下:

if x.strip():  # not empty apart from whitespace
    sorteio = sorteio + [int(x)]

您似乎正在添加到列表中;列表有一个方法:

sorteio.append(int(x))

如果您想从文件中获取随机样本,有更好的方法。一种是读取所有值,然后使用random.sample(),或者您可以在逐行读取文件时选择值,同时调整下一行是样本一部分的可能性。有关该主题的更深入讨论,请参阅 a previous answer of mine

【讨论】:

  • 我在代码中添加了这一行并运行,但结果不是我所期望的......我正在寻找的结果是这样的:读取文本文件并仅对值的随机部分进行排序,然后将其添加到列表中。我得到的结果只是“纯数字”的字符串(例如,没有空格或“\n”)
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 2013-03-11
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多