验证字符串while循环逻辑错误[Python]和csv文件错误

时间:2014-04-10 12:53:11

标签: python csv python-3.x

我正在尝试验证我的部分代码,例如:

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.

2 个答案:

答案 0 :(得分:1)

您的代码看起来有几个问题,所以让我们看看我们是否可以解决这些问题。

输入验证错误


如果您的程序在接受正确的值时遇到问题,那么您的第二个循环中至少会出现一个会给您带来麻烦的错误

if newCurrency == 'Pound Sterling' or crntCurrency =='Euro' or crntCurrency =='US Dollar' or crntCurrency =='Japanese Yen':

您会注意到您针对英镑检查了newCurrency并检查了crntCurrency其他值。由于您在input中读到newCurrency,因此需要对所有值进行比较。这一行应该是

if newCurrency== 'Pound Sterling' or newCurrency=='Euro' or newCurrency=='US Dollar' or newCurrency=='Japanese Yen':

并且Jasper对于您的代码是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?然后,当您从for循环中break时,您的while循环将看到valid = True并将退出。使用像valid之类的变量作为布尔值可以使代码更具可读性。根据我的评论,您可以使用while not valid:作为暂时条件(假设您最初设置了变量valid = False

答案 1 :(得分:0)

您收到错误是因为您关闭了文件然后尝试读取新记录。在if - 块结束时,您必须break循环for

但是您的代码中还有其他一些错误和许多非pythonic部分:

而不是做

a == "one" or a == "two" or a == "three"

你应该做

a in ["one", "two", "three"]

不要将额外的变量设置为1只是为了获得无限循环,请使用

while True:
  ...

if **new**Currency == 'Pound Sterling' or **crnt**Currency =='Euro' or **crnt**Currency =='US Dollar' or **crnt*Currency =='Japanese Yen':

我不认为这是故意的,但这将在第一点修复。