为什么要抛出 int() 内置的 ValueError 从文件中读取部分行.txt?



这是一个从studentNamesfile.txt读取的子例程

def calculate_average():
'''Calculates and displays average mark.'''
test_results_file = open('studentNamesfile.txt', 'r')
total = 0
num_recs = 0
line = ' '
while line != '':
line = test_results_file.readline()
# Convert everything after the delimiting pipe character to an integer, and add it to total.
total += int(line[line.find('|') + 1:])
num_recs += 1
test_results_file.close()

[num_recs保存从文件中读取的记录数。

studentNamesfile.txt的格式如下:

Student 01|10
Student 02|20
Student 03|30

等等。此子例程旨在读取文件中所有学生记录的标记,但是当它运行时出现此错误:

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

这个错误非常明确,但我无法弄清楚为什么会抛出它。我尝试跟踪line[line.find('|') + 1:]的值,但是当我在前一行使用print(line[line.find('|') + 1:]时,Python坚持认为它具有正确的值(例如10(。怎么了?

更新:我正在考虑line[line.find('|') + 1:]包含换行符的可能性,这正在破坏int().但是使用line[line.find('|') + 1:line.find('\')]并不能解决问题 - 抛出相同的错误。

在这里:

while line != '':
line = test_results_file.readline()

当您点击文件末尾时,.readline()返回一个空字符串,但由于这发生在while line != ''测试之后,您仍然尝试处理此行。

逐行遍历文件的规范(和更简单(方法,即遍历文件,可以避免此问题:

for line in test_result_file:
do_something_with(line)

如果你想摆脱结束换行符(你的代码就是这种情况(,你只需要注意在line上调用.rstrip()

此外,您希望确保无论发生什么情况,文件都已正确关闭。规范的方法是使用open()作为上下文管理器:

with open("path/to/file.txt") as f:
for line in test_result_file:
do_something_with(line)

这将在退出with块时调用f.close(),但它已退出(无论 for 循环刚刚完成还是发生了异常(。

此外,您无需进行复杂的计算来查找管道之后的部分,只需拆分字符串:

for line in test_results_file:
total = int(line.strip().split("|")[1])
num_recs += 1

最后,您可以使用 stdlib 的csv模块来解析您的文件,而不是手动执行......

因为它不是数值。因此,如果 python 无法将其转换为整数,则会抛出ValueError。您可以在下面的代码下进行检查。

def calculate_average():
test_results_file = open('studentNamesfile.txt', 'r')
total = 0
num_recs = 0
for line in test_results_file.readlines():
try:
total += int(line[line.find('|') + 1:])
num_recs += 1
except ValueError:
print("Invalid Data: ", line[line.find('|') + 1:])
test_results_file.close()
print("total:", total)
print("num_recs:", num_recs)
print("Average:", float(total)/num_recs)

阅读行与读取行

from io import StringIO
s = 'hellon hin how are youn'
f = StringIO(unicode(s))
l = f.readlines()
print(l)
# OUTPUT: [u'hellon', u' hin', u' how are youn']
f = StringIO(unicode(s)) 
l1 = f.readline()
# u'hellon'
l2 = f.readline()
# u' hin'
l3 = f.readline()
# u' how are youn'
l4 = f.readline()
# u''
l5 = f.readline()
# u''

阅读行

如果我们使用readlines那么它将返回一个基于n字符的列表。

阅读线

从上面的代码中我们可以看到我们stringIO中只有 3 行,但是当我们访问readline时,它总是会给我们一个空字符串。 因此,在您的代码中,您正在将其转换为整数,因为您得到了ValueError异常。

一种更简单的方法。

演示:

total = 0
num_recs = 0
with open(filename) as infile:                            #Read File
for line in infile:                                   #Iterate Each line
if "|" in line:                                   #Check if | in line
total += int(line.strip().split("|")[-1])     #Extract value and sum
num_recs += 1
print(total, num_recs)

相关内容

最新更新