Я прочитал 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, но все равно не следует оставлять открытые файлы, и я не хочу читать все листы.
Возможный дубликат [Есть ли способ, чтобы закрыть книгу, используя xlrd] (http://stackoverflow.com/questions/5403781/is-there-a-way-to-close -a-workbook-using-xlrd) –
Спасибо, Reto, стыдно, что я не видел этого среди предложений. Точнее, в одном комментарии 'release_resources()', который должен мне помочь. – deeenes
Я проверил, он работает. В случае использования 'on_demand = True' при открытии необходимо закрыть' book.release_resources() 'при закрытии. Это можно найти только в этом комментарии: http://stackoverflow.com/questions/5403781/is-there-a-way-to-close-a-workbook-using-xlrd#comment10131975_5403934 – deeenes