我正在创建一个读取文件的程序,如果该文件的第一行不是空白,则会读取接下来的四行。在这些行上执行计算,然后读取下一行。如果该行不为空,则继续。但是,我收到了这个错误:
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())
答案 0 :(得分:237)
仅供记录:
>>> int('55063.000000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'
让我来这里......
>>> float('55063.000000')
55063.0
必须使用!
答案 1 :(得分:50)
迭代文件并转换为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
答案 2 :(得分:36)
以下内容在python中完全可以接受:
int
float
float
int
float
但如果将 float 的字符串表示传递给ValueError
,或者除了整数(包括空字符串)之外的任何字符串表示,则会得到int
。如果你确实想要将float的字符串表示传递给int
,正如@katyhuff指出的那样,你可以先转换为float,然后转换为整数:
>>> 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
答案 3 :(得分:9)
原因是您将一个空字符串或字符串作为参数添加到int中 检查它之前是空的还是包含字母字符,如果它包含而不是忽略该部分。
答案 4 :(得分:4)
答案 5 :(得分:3)
你对这一行有疑问:
while file_to_read != " ":
这找不到空字符串。它找到一个由一个空格组成的字符串。大概这不是你想要的。
听取其他人的建议。这不是非常惯用的python代码,如果直接迭代文件会更清楚,但我认为这个问题也值得注意。
答案 6 :(得分:3)
请在简单文件上测试此功能(split()
)。我遇到了同样的问题,发现这是因为split()
没有正确编写(异常处理)。
答案 7 :(得分:1)
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
该代码存在问题。 readings
是从文件中读取的新行 - 它是一个字符串。因此,你不应该将它与0进行比较。此外,你不能只是将它转换为整数,除非你确定它确实是一个整数。例如,空行会在这里产生错误(正如你肯定发现的那样)。
为什么你需要全球统计?这在Python中肯定是糟糕的设计。
答案 8 :(得分:1)
我最近遇到一个案例,这些答案都不起作用。我遇到了CSV数据,其中有空字节与数据混合在一起,并且这些空字节没有被剥离。因此,我的数字字符串在剥离后由以下字节组成:
\x00\x31\x00\x0d\x00
对此,我做了:
countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)
...其中,字段是由分割线产生的csv值的列表。
答案 9 :(得分:1)
如果有
floatInString = '5.0'
您可以使用int
将其转换为floatInInt = int(float(floatInString))
答案 10 :(得分:0)
当尝试在同一文件对象的for循环中使用readlines()时遇到了同样的问题...我的怀疑是在同一文件对象的readline()中触发了readling()导致了此错误。
最佳解决方案是使用seek(0)重置文件指针或 通过设置一些标志来处理条件,然后通过检查设置条件为同一文件创建新对象。
答案 11 :(得分:0)
我找到了解决方法。 Python会将数字转换为浮点数。只需先调用float,然后将其转换为int即可:
output = int(float(input))
答案 12 :(得分:0)
我得到类似的错误,结果是数据集有空白值,python无法转换为整数。
答案 13 :(得分:0)
我正在创建一个读取的程序 文件和文件的第一行 不是空白,它读取下四个 线。进行计算 那些线然后下一行是 读取。
这样的事情应该有效:
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
答案 14 :(得分:0)
这似乎是读数有时是一个空字符串,并且显然会出现错误。 您可以在 int(读数)命令之前将额外的检查添加到while循环中,例如:
while readings != 0 | readings != '':
global count
readings = int(readings)
答案 15 :(得分:0)
我很难弄清楚实际原因,当我们没有从文件中正确读取时会发生这种情况。 您需要打开文件并使用readlines()方法进行读取,如下所示:
with open('/content/drive/pre-processed-users1.1.tsv') as f:
file=f.readlines()
它纠正格式输出
答案 16 :(得分:0)
由于此行,您的答案抛出错误
readings = int(readings)
答案 17 :(得分:0)
如果上述所有解决方案都不适合您的另一个答案。
我原来的错误类似于 OP:ValueError: invalid literal for int() with base 10: '52,002'
然后我尝试了接受的答案并得到了这个错误:ValueError: could not convert string to float: '52,002' ——这是我尝试 int(float(variable_name)) 的时候 >
我的解决方案是将字符串转换为浮点数并将其留在那里。我只需要检查字符串是否是数值,以便我可以正确处理它。
try:
float(variable_name)
except ValueError:
print("The value you entered was not a number, please enter a different number")