除了声明

时间:2011-08-20 17:54:28

标签: python

在函数check_price()中,我尝试打开一个不存在的.txt文件来读取和 我想使用except语句来捕获IOerror。

但之后,我创建了一个.txt文件,我想使用相同的函数来读取它。但是我的函数不读取文件。任何人都可以帮助我吗?

我打算做一个价格检查程序。

样本看起来像这样。

Menu:
(I)nstructions  
(L)oad Products  
(S)ave Products  
(A)dd Product  
(C)heck Prices  
(Q)uit  
>>> C  
No products.  

Menu:  
(I)nstructions  
(L)oad Products  
(S)ave Products  
(A)dd Product  
(C)heck Prices  
(Q)uit  
>>> L  
Enter file name: products.txt  

Menu:  
(I)nstructions  
(L)oad Products  
(S)ave Products  
(A)dd Product  
(C)heck Prices  
(Q)uit  

>>> c  
Huggies is $0.39 per unit.  
Snugglers is $0.26 per unit.  
Baby Love is $0.23 per unit.  

我的功能:

def check_price():
        while True:
            try:
                text_file = open("product.txt",'r')
                break
            except IOError:
                print"no product"
                text_file = open("product.txt",'r')
                line = text_file.readline()
                if line == "":
                    break
                print ""

4 个答案:

答案 0 :(得分:3)

有两个问题。一,打开文件的地方,二,使用while语句打开文件。如果你从逻辑上考虑它,你真的不想继续重新打开和关闭那个文件。只需打开一次,从中读取每一行,然后关闭它。所以你的阅读功能可能如下所示:

def check_price(file_path):

    # try and open the file. If there's an exception, return an error
    try:
        f = open(filepath, "r")
    except IOError as e:
        # do something with e, possibly.
        # could return an error code?
        # could raise an exception?
        # could not do anything and let the parent function 
        # handle the exception:
        return -1

    # read until no more lines appear
    while True:
        line = f.readline()
        if not line:  # not x is true in python for False, "", []
            break

        # process that line

    f.close()  # don't forget this

关于如何处理异常,有一些设计问题。如果存在IOError,您是否在此处,在函数中处理它们,这意味着异常“传播”到上面的函数。该功能可能在您的用户界面中,应该处理此类错误消息。在这样的函数中处理它们的问题是你必须维护一个自己的异常错误代码列表,这会增加你的维护负担......由你自己决定。

我应该指出另一种处理文件读取的方法,然而,这种方法更好,并且出现在较新版本的python中。这是:

def check_price(file_path):

    with open(filepath, "r") as f:
        while True:
            line = f.readline()
            if not line: 
                break
            # process line

    # here, at the same level of indentation as the with statement,
    # f has been automatically closed for you.

我个人喜欢这种方法。 with语句控制f生成的open对象的生命周期,这样您就不必记住关闭它。

答案 1 :(得分:0)

你是什么意思不读文件? 除此之外,为什么在break声明之后有代码?

我认为文件没有被读取,因为你做了一个缩进错误,使break语句后面的行与except块的缩进相同,而它们应该出现在{{1}之后具有较低级别缩进的块。 尝试将额外的代码移到except块中或删除额外的文件打开并减少代码缩进级别。

我认为您的错误是因为您忘记try退出while循环的当前迭代,并且之后的所有代码都不会被执行。

答案 2 :(得分:0)

您没有在成功打开文件后运行的任何代码。 break之后的所有代码仍然是except:块的一部分。修复你的缩进。

答案 3 :(得分:-1)

这个功能是荒谬的。这里没有理由使用while循环。特别是,逻辑很容易进入无限循环。

以下是一些建议:

  1. 我会避免使用try / except,只需使用os.path.exists直接检查文件是否存在。

  2. 如果该文件尚不存在,请创建该文件。使用“r”打开不会自动创建文件。请参阅open()的文档。我想你想在这里使用“w”,只是为了强制创建文件。但是如果该文件尚不存在,您只想这样做,否则您将截断该文件。