为什么我在运行python脚本时收到“关闭文件”消息?

时间:2011-05-12 19:23:12

标签: python file

简单的代码,只打印出一个我放入文本文件的URL列表(它是用每个末尾的\ n字符打印它们 - 我怎么摆脱\ n?) :

import mechanize, fileinput

with open('F:\Python\url_list2.txt') as urls:
    content = urls.readlines()
print content

无论如何,它打印出来的名单很棒。再次运行它,我在python shell中收到此消息:

<closed file 'F:\Python\url_list2.txt', mode 'r' at 0x0000000002E4E390>

发生了什么事?使用Windows 7 x64,如果这有什么不同?

6 个答案:

答案 0 :(得分:3)

with仅在缩进块中保持文件打开。尝试:

import mechanize, fileinput

with open('F:\Python\url_list2.txt') as urls:
    content = urls.readlines()
    print urls # file still open.
print content

基本上with是常见try except finally模式的语法糖:

try:
    urls = open('F:\Python\url_list2.txt')
    # rest of indented block
finally:
    urls.close()
# stuff outside of indented block

因此,您的代码转换为:

import mechanize, fileinput
try:
    urls = open('F:\Python\url_list2.txt')
    # rest of indented block
    content = urls.readlines()
finally:
    urls.close()
# stuff outside of indented block.
print urls

因此,您可以看到为什么您的网址被报告为已关闭的文件...您只需退出with缩进块即可将其关闭。您可能希望print content看到您从已关闭的content文件加载到变量中的urls

答案 1 :(得分:2)

尝试打印内容(关闭后网址已消失。)

答案 2 :(得分:2)

也许您想要打印content而不是urls

要删除换行符,请使用rstrip

答案 3 :(得分:1)

当您使用with时,这就是实际发生的事情:

with open(filepath) as f:
    # do stuff
print "YAY"
# do more stuff

以上相当于说:

f = open(filepath)
try:
    # do stuff
except:
    f.close()
finally:
    f.close()
    print "YAY"
    # do more stuff

这是否解释了您收到该错误的原因?

答案 4 :(得分:0)

可能是你已经调用close()的文件对象?我们能看到您的代码吗?

答案 5 :(得分:0)

with语句在其中的所有语句执行后自动关闭句柄。如果您之后需要访问句柄:

import mechanize, fileinput

urls = open('F:\Python\url_list2.txt')
content = urls.readlines()
print content

如果您想摆脱每一行末尾的\n,请使用.strip()

import mechanize, fileinput

urls = open('F:\Python\url_list2.txt')
content = [x.strip() for x in urls.readlines()]
print content