python判断输入字符对错_在循环逻辑错误[Python]和CSV文件错误时验证字符串

我正在尝试验证我的代码的一部分,如下所示:

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最初设置了一个变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值