2015-10-20 2 views
3

Я прочитал 150 файлов excel в цикле, открыв их с помощью xlrd.open_workbook(), который возвращает объект Book. В конце концов, когда я попытался umount объем, я не мог, и когда я проверил с lsof, я обнаружил, что 6 из файлов были открыты:Python xlrd.Book: как закрыть файлы?

$ 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 

Вот моя функция прочитать файлы 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() 

объект Book не не имеет close() метод, ни какие-либо открытые объекты типа файла среди его свойств, за исключением того, стандартный вывод. Этот howto не говорит об этом (не нашел официальных документов). Я не вижу, как я могу закрыть файл, и также странно, что 6 остается открытым после прочтения 150 из них.

Редактировать: это может быть связано с this, но все равно не следует оставлять открытые файлы, и я не хочу читать все листы.

+1

Возможный дубликат [Есть ли способ, чтобы закрыть книгу, используя xlrd] (http://stackoverflow.com/questions/5403781/is-there-a-way-to-close -a-workbook-using-xlrd) –

+0

Спасибо, Reto, стыдно, что я не видел этого среди предложений. Точнее, в одном комментарии 'release_resources()', который должен мне помочь. – deeenes

+1

Я проверил, он работает. В случае использования 'on_demand = True' при открытии необходимо закрыть' book.release_resources() 'при закрытии. Это можно найти только в этом комментарии: http://stackoverflow.com/questions/5403781/is-there-a-way-to-close-a-workbook-using-xlrd#comment10131975_5403934 – deeenes

ответ

2

В случае, если вы открываете книгу с on_demand = True для использования более экономичного ресурса (see here how does it work), вам нужно позвонить в 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 
Смежные вопросы