我有一个像这样的文本文件
Coffee 1
18.0
Coffee 2
25.0
我写了一个程序来读取和打印文本文件中的数据,我的代码是这样的:
file_coffee = open('coffee.txt','r')
description = file_coffee.readline()
while description != '':
qty = file_coffee.readline()
qty = qty.rstrip('\n')
qty = float(qty)
description = description.rstrip('\n')
print (description)
print (qty)
description = file_coffee.readline()
file_coffee.close()
当我运行程序时,我遇到了
Coffee 1
18.0
Coffee 2
25.0
ValueError: could not convert string to float:
虽然下一行绝对是一个可转换的字符串。此外,我不明白为什么程序仍然打印出来然后通知有问题。
我知道当我使用python将数据放到coffee.txt时,我也把'\ n'放在了所有东西之后。所以我尝试首先从qty变量中剥离'\ n'然后使用float但它仍然无效。然而,我的书中的例子刚刚使用过:qty = float(file_coffee.readline())
我也试过了,但它也没有用。
这是一个初学者的问题,并提前感谢!!
答案 0 :(得分:1)
使用try/except
,使用with
打开文件,然后迭代文件对象f
。您不需要while循环来读取文件。到达文件末尾时,迭代将停止:
with open('coffee.txt', 'r') as f: # closes automatically
for qty in f:
try:
qty = float(qty) # try to cast to float
except ValueError:
pass
print(qty) # will either be a float or Coffee 1 etc..
如果浮点数是第二行,我们可以使用next跳过行,因为文件对象返回它自己的迭代器:
with open('coffee.txt', 'r') as f:
next(f) # skip very first line
for qty in f:
qty = float(qty)
next(f,"") # skips every other line
print(qty)
输出:
18.0
25.0
如果文件不是很大,我们可以使用map
映射到浮点数并获取每个第二个元素切片readlines
:
with open('coffee.txt', 'r') as f:
floats = map(float,f.readlines()[1::2]) # start at second element and get every second element after
print(list(floats))
[18.0, 25.0]
您无需剥离以进行浮动:
In [5]: float(" 33 ")
Out[5]: 33.0
In [6]: float(" 33 \n")
Out[6]: 33.0