infilehandle = open ("receipts-10-28-13.txt", "r")
# FUNCTIONS
def stripsigns( astring ):
"""Remove dollar signs"""
signs = "$"
nosigns = ""
for numbers in astring:
if numbers not in signs:
nosigns = nosigns + numbers
return nosigns
def totaltake():
"""Calculate total take"""
total = 0
for line in infilehandle:
values = line.split(':')
cardnumbers = values[1]
cardnumbers = stripsigns(cardnumbers)
total = (total + eval(cardnumbers))
total = round(total,2)
return total
# more code etc
def computetax(rate, total):
total = totaltake() - totaltip()
taxed = total * rate
taxed = round(taxed,2)
return taxed
# more code etc
# VARS
total = totaltake()
tips = totaltip()
tax = computetax(rate,total)
rate = eval(input("Input the tax rate as an integer:"))
# PRINT
print("Total take: $", totaltake())
print("Total tips: $", totaltips())
print("Tax owed: $", computetax(rate,total))
我正在尝试创建一个文件来查看txt文件中的元素,然后根据文件中的数字计算内容。这些函数都是totaltake()的变量,它是从文件中获取数字并查找总和,或者是computetax(),它取其他函数计算的数字并乘以/除/等。我已经单独测试了所有功能,它们都可以工作,但是当我尝试将它们放在一个文件中时,它不会给我我想要的输出,我不知道为什么。它会打印vars列表中第一个的值,其他所有内容的值为0 - 所以对于我上面的代码版本,它会打印
Total take: $ 6533.47
Total tips: $ 0
Tax owed: $ 0
基本上,我做错了什么?
答案 0 :(得分:0)
请参阅Is file object in python an iterable
File objects are iterators,这意味着一旦文件被迭代完成,除非通过调用file.seek(0)
将文件重置为文件的开头,否则不能再次遍历该文件。
当您只调用totaltake()
时,因为infilehandle
尚未迭代,for循环遍历infilehandle
中的所有行,这就是您获得预期结果的原因。
但是,当您将computetax()
与totaltake()
放在一起时,totaltake()
会自行调用,然后再次调用computetax()
。由于infilehandle
已在第一次调用totaltake()
时迭代完成,因此第二次不输入for循环,并返回total
的初始值0
由于totaltake()
返回的值不应更改,因此您应修改computetax()
,以便将total
作为参数传递,而不是调用totaltake()
。您应该这样做,以便它还需要tips
作为参数,而不是重新计算值。
如果您无法修改computetake()
,您还可以通过在infilehandle
的开头添加infilehandle.seek(0)
来寻找totaltake()
的开头,以便再次进行迭代