我正在尝试验证我的代码的一部分,如下所示:
loop2 =1
while loop2==1:
crntCurrency = input("Please enter the current currency: ")
if crntCurrency == 'Pound Sterling' or crntCurrency =='Euro' or crntCurrency =='US Dollar' or crntCurrency =='Japanese Yen':
break
else:
print("sorry that was invalid, please try agian:")
但是,我在这里再次尝试:
loop3 = 1
while loop3 ==1:
newCurrency = input("Please enter the currency you would like to convert to: ")
if newCurrency == 'Pound Sterling' or crntCurrency =='Euro' or crntCurrency =='US Dollar' or crntCurrency =='Japanese Yen':
break
else:
print("sorry that was invalid, please try agian:")
exRtFile = open ('exchangeRate.csv')
exchReader = csv.reader(exRtFile)
validateloop2 = 0
while validateloop2 == 0:
for row in exchReader:
currency = row and row[0]
if currency == newCurrency:
newRt = row[1]
validateloop2 =+1
toPound = crntAmnt/float(crntRt)
newAmount = int(toPound)*float(newRt)
print("You have: " ,newAmount, newCurrency,)
exRtFile.close()
并且在打印“抱歉无效,请重试:”之后陷入永久循环。如果输入正确,则会收到错误消息(我相信这是一个缩进错误):
for row in exchReader:
ValueError: I/O operation on closed file.
解决方案
您的代码似乎有几个问题,让我们看看是否可以一次解决它们。
输入验证错误
如果您的程序在接受正确的值时遇到问题,则第二个循环中至少有一个错误会给您带来麻烦
if newCurrency == 'Pound Sterling' or crntCurrency =='Euro' or crntCurrency =='US Dollar' or crntCurrency =='Japanese Yen':
您会发现您对照newCurrency英镑crntCurrency进行了检查,并检查了其他值。由于您读了inputasnewCurrency,因此需要针对所有值与此进行比较。这行应该是
if newCurrency== 'Pound Sterling' or newCurrency=='Euro' or newCurrency=='US Dollar' or newCurrency=='Japanese Yen':
而碧玉是你的代码是正确的unpythonic。
newCurrency in ['Pound Sterling', 'Euro', 'US Dollar', 'Japanese Yen']
是一种更好的方法。更好的是,在代码的开头定义一个列表,以便可以在其他地方使用它
currency = ['Pound Sterling', 'Euro', 'US Dollar', 'Japanese Yen']
然后你可以使用
if newCurrency in currency:
然后您可以currency在代码中重用其他地方!
I / O操作错误
接下来是程序在关闭的文件上引发I / O操作的问题
for row in exchReader:
ValueError: I/O operation on closed file.
问题在这里
exRtFile = open ('exchangeRate.csv')
exchReader = csv.reader(exRtFile)
validateloop2 = 0
while validateloop2 == 0:
for row in exchReader:
# if something
exRtFile.close()
找到条件后,便用关闭了文件exRtFile.close(),但是for循环for row in exchReader仍在运行。因此,退出if语句后,它将再次循环遍历您的循环,并且您的程序将尝试从文件中exchReader读取内容,因为它是csv读取器,但是您已经关闭了该csv文件。因此,您有两种选择:(1)while在满足有效条件并完成迭代后关闭循环之外的文件,或者(2)在满足if条件后关闭文件并放入break命令以退出文件for循环。
风格建议
关于样式的其他一些注意事项:为什么要使用while validateloop2 == 0?为什么不只设置一个变量valid = False,然后在得到if条件时设置valid = True?然后,当您break从for循环中时,while循环将看到该情况valid = True并退出。使用像valid布尔值这样的变量可使代码更具可读性。根据我的评论,您可以将其while not valid:用作条件(假设您valid = False最初设置了一个变量