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,如果这有什么不同?
答案 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