当前位置: 代码迷 >> python >> 使用xlutils.filter后如何关闭文件
  详细解决方案

使用xlutils.filter后如何关闭文件

热度:79   发布时间:2023-06-21 10:57:40.0

在使用xlutils.filter( )之后,谁能帮助我删除xls文件并修复以下错误? 我尝试从文件系统(Windows 7 64位)中删除一个excel文件,但是它说:

Traceback (most recent call last):
  File "insert_n_blank_rows.py", line 93, in <module>
    main()
  File "insert_n_blank_rows.py", line 89, in main
    insert_n_blank_rows(inputfile, n_rows, position)
  File "insert_n_blank_rows.py", line 80, in insert_n_blank_rows
    os.remove(filename)
WindowsError: [Error 32] The process cannot access the file because it is being
used by another process: 'text.xls'

我想遵循明智的建议仅使用以下方法打开文件:

with open(inputfile) as f:
    ...

并在附带条款之后删除了文件,但是在这种情况下我不知道该如何处理。 任何人都可以重现该错误,如果可以,那么有人对如何解决此问题有建议吗? 作为inputfile.xls,您可以仅使用Excel 97格式工作表,其中1列包含4行文本。

我的python文件“ insert_n_blank_rows.py”是:

__author__ = "Arjen Jellema"

"""
This script will insert n empty rows after an excelsheetposition
into a excel sheet using module xlrd and xlwt
first it copies the file
and then inserts empty rows
then saves the new file
then removes the old file
"""

import os
import sys
import xlrd
import xlwt
from xlutils.filter import BaseReader, BaseFilter, BaseWriter, process

def insert_n_blank_rows(filename, n_rows, position):
    # this function will insert n blank row right after position as read from
    # an Excelsheet; so the cell A1 has row 1

    class Reader(BaseReader):
        def get_filepaths(self):
            return [os.path.abspath(filename)]

    class Filter(BaseFilter):
        pending_row = None
        def workbook(self,rdbook,wtbook_name):
            self.next.workbook(rdbook,filename+'.new')
        def row(self,rdrowx,wtrowx):
            self.pending_row = (rdrowx,wtrowx)
        def cell(self,rdrowx,rdcolx,wtrowx,wtcolx):
            row_offset = 0
            col_offset = 0
            buildHistoryIndexEnd = position
            if rdrowx >= buildHistoryIndexEnd:
                row_offset = 1
            if rdcolx > 1:
                col_offset = 0

            self.next.cell(rdrowx,rdcolx,wtrowx+row_offset,wtcolx+col_offset)

    class Writer(BaseWriter):
        def get_stream(self,filename):
            return file(filename,'wb')

    if n_rows == 0 or n_rows < 0:
        # give warning
        print "Warning: number of rows is equal to or smaller than 0,",
        print " nothing inserted"
        raw_input()
        sys.exit()
    elif n_rows == 1:
        # inserts 1 empty row or column in sheet
        process(Reader(),Filter(),Writer())
    elif n_rows == 2:
        # inserts 2 empty rows or columns in sheet
        process(Reader(),Filter(),Filter(),Writer())
    elif n_rows == 3:
        # inserts 3 empty rows or columns in sheet
        process(Reader(),Filter(),Filter(),Filter(),Writer())
    elif n_rows == 4:
        # inserts 4 empty rows or columns in sheet
        process(Reader(),Filter(),Filter(),Filter(),Filter(),Writer())
    elif n_rows == 5:
        # inserts 5 empty rows or columns in sheet
        process(Reader(),Filter(),Filter(),Filter(),Filter(),Filter(),Writer())
    elif n_rows > 5:
        # give warning
        print "Warning: number of rows exceeds 5,",
        print " nothing inserted"
        raw_input()
        sys.exit()
    else:
        print "Warning, something unexpected happened"
        raw_input()
        sys.exit()

    # remove old file
    os.remove(filename)
    os.rename(filename+".new", filename.rstrip('.new'))

def main():
    inputfile = "text.xls"

    # this will insert n rows after position
    n_rows = 3
    position = 1
    insert_n_blank_rows(inputfile, n_rows, position)


if __name__ == "__main__":
    main()
    sys.exit()

也许您必须在删除文件之前关闭文件。

在get_stream返回的文件上显示close()。

我不熟悉您正在使用的库,但是希望对您有所帮助。

好的,问题出在on_demand=True选项中。 通过简单地覆盖class Reader(BaseReader)get_filepaths() ,我已经解决了我的问题。 因此,该类必须编写为:

class Reader(BaseReader):
    def get_filepaths(self):
        #print "os.path.abspath(filename): %s" % os.path.abspath(filename)
        return [os.path.abspath(filename)]

    def get_workbooks(self):
        for path in self.get_filepaths():
            yield (
                xlrd.open_workbook(
                    path,
                    formatting_info=1,
                    on_demand=False,
                    ragged_rows=True),
                os.path.split(path)[1]
                )
  相关解决方案