乐者为王

Do one thing, and do it well.

使用Scrapy爬取小说(5)

今天的任务是重构TxtPipeline。

先看下TxtPipeline中负责写文件的代码片段:

1
2
3
4
f = open(filename, 'w')
f.write(title)
f.write(content)
f.close()

我们经常会看到这样的代码,但它存在严重的问题,你能把它找出来吗?

首先,open函数打开文件,并返回文件句柄,该句柄是由操作系统分配的。接着就是调用write方法写文件。最后是调用close方法关闭文件。文件使用完毕后必须关闭,因为文件句柄会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

由于文件读写时都有可能产生IOError,一旦出错,后面的close方法就不会被调用。所以,为确保无论是否出错都能正常地关闭文件和释放文件句柄,我们需要使用如下方法来实现:

1
2
3
4
5
6
7
try:
  f = open(filename, 'w')
  f.write(title)
  f.write(content)
finally:
  if f:
    f.close()

但每次都这么写实在太繁琐。其实,我们可以使用with语句来帮我们自动管理文件资源:

1
2
3
with open(filename, 'w') as f:
  f.write(title)
  f.write(content)

这和前面的try-finally是一样的,但是代码更加简洁,而且不必调用close方法。

Comments