首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用xlutils.filter后关闭文件

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

Stack Overflow用户
提问于 2014-03-14 22:55:18
回答 2查看 873关注 0票数 1

有没有人可以帮我在使用xlutils.filter (http://www.python-excel.org/)后删除一个xls文件并修复下面的错误?我尝试从文件系统(Windows 7 64位)中删除excel文件,但它显示:

代码语言:javascript
复制
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'

我想遵循明智的建议,只使用以下命令打开文件:

代码语言:javascript
复制
with open(inputfile) as f:
    ...

在with -子句之后删除文件,但我不知道在这种情况下该如何处理。任何人都可以重现这个错误吗?如果是这样的话,是否有人有一个建议来解决这个问题呢?作为inputfile.xls,您可以只使用Excel97格式的工作表,在1列中包含4行文本。

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

代码语言:javascript
复制
__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()
EN

回答 2

Stack Overflow用户

发布于 2014-03-14 23:23:51

也许您必须先关闭该文件,然后再删除它。

http://pythonhosted.org/xlutils/filter.html#directorywriter

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-03-20 07:27:27

好的,问题出在on_demand=True选项中。通过简单地覆盖class Reader(BaseReader)中的get_filepaths(),我已经解决了我的问题。所以这个类必须写成:

代码语言:javascript
复制
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]
                )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22408489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档