gpt4 book ai didi

python - 为什么使用 int() 内置从 .txt 文件读取部分行时抛出 ValueError ?

转载 作者:行者123 更新时间:2023-12-01 01:34:24 27 4
gpt4 key购买 nike

这是一个从 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:] 在上一行。出了什么问题?

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

最佳答案

这里:

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

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

逐行迭代文件的规范(而且更简单)方法,即迭代文件,可以避免此问题:

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 block 时,这将调用 f.close(),但它已退出(无论 for 循环刚刚完成还是发生了异常)。

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

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

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

关于python - 为什么使用 int() 内置从 .txt 文件读取部分行时抛出 ValueError ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52516127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com