为什么使用 int() 内置读取 .txt 文件中的部分行抛出 ValueError?
Why throw ValueError with int() builtin reading parts of lines from .txt file?
这是一个从 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('\')]
并不能解决问题 - 会抛出同样的错误。
因为它不是数值。因此,如果 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)
readlines 与 readlines
from io import StringIO
s = 'hello\n hi\n how are you\n'
f = StringIO(unicode(s))
l = f.readlines()
print(l)
# OUTPUT: [u'hello\n', u' hi\n', u' how are you\n']
f = StringIO(unicode(s))
l1 = f.readline()
# u'hello\n'
l2 = f.readline()
# u' hi\n'
l3 = f.readline()
# u' how are you\n'
l4 = f.readline()
# u''
l5 = f.readline()
# u''
阅读线
如果我们使用 readlines
那么它将 return 一个基于 \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)
此处:
while line != '':
line = test_results_file.readline()
当你到达文件末尾时,.readline()
returns 一个空字符串,但是由于这种情况发生 在 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
模块来解析您的文件,而不是手动执行...
这是一个从 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('\')]
并不能解决问题 - 会抛出同样的错误。
因为它不是数值。因此,如果 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)
readlines 与 readlines
from io import StringIO
s = 'hello\n hi\n how are you\n'
f = StringIO(unicode(s))
l = f.readlines()
print(l)
# OUTPUT: [u'hello\n', u' hi\n', u' how are you\n']
f = StringIO(unicode(s))
l1 = f.readline()
# u'hello\n'
l2 = f.readline()
# u' hi\n'
l3 = f.readline()
# u' how are you\n'
l4 = f.readline()
# u''
l5 = f.readline()
# u''
阅读线
如果我们使用 readlines
那么它将 return 一个基于 \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)
此处:
while line != '':
line = test_results_file.readline()
当你到达文件末尾时,.readline()
returns 一个空字符串,但是由于这种情况发生 在 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
模块来解析您的文件,而不是手动执行...