0

我正在尝试制作一个简单的程序,它应该在文本文件中搜索“为什么”这个词并打印它出现的次数。这是代码:

def get():
    a = 0
    target = str(raw_input('name file > '))
    file = open(target,'r+')
    main(file)

def main(target):
    for x in target:
        if x == 'why':
           a+= 1 

    print a

file.close()

get()

但是我应该把它放在file.close()哪里?我是否需要将它放在 main() 内的 for 循环中,还是可以将它放在代码的末尾?

4

2 回答 2

6

file.close()在完成文件处理后执行此操作。所以在这里,最好在for循环之后进行。

def main(target):for x in target:
    if x == 'why':
        a+= 1 
    file.close()
    print a

或者,您可以with open('file.txt', 'r+') as f自动关闭文件(并且更 Pythonic):

def get():
    a = 0
    target = str(raw_input('name file > '))
    with open(target,'r+') as myfile:
        main(myfile)

def main(target):
    for x in target:
        if x == 'why':
            a+= 1  
    print a

get()

所以在这里,在 main() 完成后,文件将自动关闭。


请注意,您不应该命名您的变量file,因为它已经是一个内置函数,所以您只是覆盖它。

str()此外,没有必要打电话raw_input():)。raw_input已经返回一个字符串。


最后,您的错误实际上会引发 UnboundLocalError,因为a仅在get()函数中定义。如果您想在其他函数中访问它,global a请在定义变量之前放置:)。

于 2013-07-15T02:42:49.493 回答
0

管理开放对象的 Pythonic 方式file使用语句。这将在块的末尾关闭。由于是 Python 内置的(并且您不想附加到文件中),因此您的函数的固定版本可能如下所示:withfilefileget()

def get():
    filename = raw_input('name file > ')
    with open(filename, 'r') as source:
        main(source)

请注意,x == 'why'将始终评估为,False因为for x in target遍历 中的每一target留下换行符。strip如果你想比较整条线,你需要关闭它。您的固定版本main()可能如下所示:

def main(target):
    print sum(line.strip() == 'why' for line in target)

如果您想在每一行上count出现每个why,那么sum(line.count('why') for line in target)可能是一种更好的方法。

最后,如果你想要import这个文件(比如说进入一套单元测试!),那么你应该保护你对(命名模糊的)get()函数的调用if __name__ == '__main__':

if __name__ == '__main__':
    get()
于 2013-07-15T17:17:37.460 回答