Python xlrd.Book:如何关闭文件?

dee*_*nes 10 python file-io xlrd

我在一个循环中读取150个excel文件,打开它们xlrd.open_workbook(),返回一个Book对象.最后,当我尝试umount卷时,我无法使用,当我查看时lsof,我发现其中6个文件仍处于打开状态:

$ lsof | grep volumename

python2   32349         deeenes  mem       REG               0,40    138240     181517 /.../150119.xls
python2   32349         deeenes  mem       REG               0,40    135168     181482 /.../150609.xls
python2   32349         deeenes  mem       REG               0,40    140800     181495 /.../140828.xls
python2   32349         deeenes    5r      REG               0,40    140800     181495 /.../140828.xls
python2   32349         deeenes    6r      REG               0,40    135168     181482 /.../150609.xls
python2   32349         deeenes    7r      REG               0,40    138240     181517 /.../150119.xls
Run Code Online (Sandbox Code Playgroud)

这是我的函数我用以下内容读取xls文件:( 为了清晰起见而剥离)

import sys
import xlrd
from xlrd.biffh import XLRDError

def read_xls(xls_file, sheet = '', return_table = True):
    try:
        book = xlrd.open_workbook(xls_file, on_demand = True)
        try:
            sheet = book.sheet_by_name(sheet)
        except XLRDError:
            sheet = book.sheet_by_index(0)
        table = [[str(c.value) for c in sheet.row(i)] for i in xrange(sheet.nrows)]
        if not return_table:
            table = None
        return table
    except IOError:
        sys.stdout.write('No such file: %s\n' % xls_file)
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

Book对象没有close()方法,除了stdout之外,其属性中没有任何打开的文件类型对象.这个howto没有说明这一点(还没有找到官方文档).我不知道如何关闭文件,并且在阅读其中的150个后仍然保持打开是很奇怪的.

编辑:它可能与有关,但仍然不应该保留打开文件,我不想阅读所有工作表.

dee*_*nes 12

如果您打开一个工作簿以on_demand = True获得更经济的资源使用(请参见此处如何工作),您需要release_resources()在最后调用方法.作为一个最小的例子:

import xlrd

book = xlrd.open_workbook('workbook.xls', on_demand = True)
sheet = book.sheet_by_index(0)
data = [[str(c.value) for c in sheet.row(i)] for i in xrange(sheet.nrows)]
book.release_resources()
del book
Run Code Online (Sandbox Code Playgroud)