programing

Openpyxl이 읽기 전용 모드에서 Excel 워크북을 닫지 않음

newstyles 2023. 4. 29. 08:55

Openpyxl이 읽기 전용 모드에서 Excel 워크북을 닫지 않음

저는 파이썬에서 엑셀 파일을 읽을 수 있고, 읽기가 끝난 후에도 파이썬 스크립트를 계속 실행할 수 있고, 그 동안 다른 프로세스에서 엑셀 파일을 편집할 수 있기를 원합니다.저는 파이썬 2.7과 openpyxl을 사용하고 있습니다.

현재는 다음과 같습니다.

from openpyxl import load_workbook

def get_excel_data():
    OESwb = load_workbook(filename = OESconfigFile, data_only=True, 
                          read_only=True)
    ws = OESwb.get_sheet_by_name('MC01')
    aValue = ws['A1'].value
    return aValue

val = get_excel_data()

기능을 실행한 후에도 Excel 파일은 다른 프로세스에서 액세스할 수 있도록 잠겨 있습니다("filename"이 현재 사용 중입니다).Python에서 더 이상 읽고 싶지 않을 때에도 나중에 다시 시도하십시오.")

스크립트에서 파일을 닫으려면 어떻게 해야 합니까?OESwb.close()를 시도했지만 "Workbook' 개체에 'close' 속성이 없습니다."라는 오류가 표시됩니다.는 이 게시물을 찾았지만 도움이 되지 않는 것 같습니다.

편집: OESwb.save('filename)로 나타납니다.xlsx')가 작동하지만 read_only=False인 경우에만 작동합니다.그러나 파일을 닫고 읽기 전용 모드로 유지하는 것이 이상적입니다.load_workbook이 완료된 후 파일을 닫아야 하므로 openpyxl에 대한 버그인 것 같습니다.

어떤 엄격한 이유로, 스택 오버플로는 제가 답변을 게시할 수 있게 해주겠지만 저는 논평하거나 투표할 '담당자'가 충분하지 않습니다. 그래서 여기 있습니다.

의 일반적인 대답.wb._archive.close()저한테는 안 통했어요.읽기 전용 모드를 사용하고 있기 때문일 수 있습니다.'정상' 모드에서는 정상적으로 작동할 수 있습니다.

Bmiller의 답변이 저에게도 효과가 있었던 유일한 답변입니다.

with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = load_workbook(in_mem_file, read_only=True)

그리고 그가 말했듯이, 읽기 전용으로만 사용하는 것보다 open()으로 로드하는 이 더 빠릅니다.

biller의 답변에 기반한 내 작업 코드:

import openpyxl
import io

xlsx_filename=r'C:/location/of/file.xlsx'
with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = openpyxl.load_workbook(in_mem_file, read_only=True)

xlsx 파일을 읽기 전용 모드로 닫기 위해 이 모든 솔루션을 사용해 보았지만 아무도 작동하지 않는 것 같습니다.저는 결국 mem 파일을 사용하게 되었습니다.

with open(xlsx_filename, "rb") as f:
    in_mem_file = io.BytesIO(f.read())

wb = load_workbook(in_mem_file, read_only=True)

로드 속도가 빨라져 아무것도 닫을 걱정이 없습니다.

wb._archive.close()

use_iterator에서도 작동합니다.

최신 정보를 위해 openpyxl 2.4.4+는 다음을 제공합니다.Workbook.close()방법.다음은 참고 자료입니다.

http://openpyxl.readthedocs.io/en/stable/changes.html?highlight=close#id86
https://bitbucket.org/openpyxl/openpyxl/issues/673

저도 이것이 문제라는 것을 알게 되었는데, 문제집에 가까운 방법이 없는 것이 이상하다고 생각합니다.

제가 생각해 낸 해결책은 스프레드시트를 읽을 때마다 코드에 의미 없는 저장을 하지 않도록 파일을 "닫는" 컨텍스트 관리자였습니다.

@contextlib.contextmanager
def load_worksheet_with_close(filename, *args, **kwargs):
    '''
    Open an openpyxl worksheet and automatically close it when finished.
    '''
    wb = openpyxl.load_workbook(filename, *args, **kwargs)
    yield wb
    # Create path in temporary directory and write workbook there to force
    # it to close
    path = os.path.join(tempfile.gettempdir(), os.path.basename(filename))
    wb.save(path)
    os.remove(path)

사용 방법:

with load_worksheet_with_close('myworkbook.xlsx') as wb:
    # Do things with workbook

시도할 수 있습니다.

wb = None

리소스를 해제하고 필요할 때 동일한 변수 또는 다른 변수로 다시 로드할 수 있습니다.

사용하다OESwb._archive.close() "ZipFile"에서 열려 있던 추가 .'read_only=True'후 드모에서 더 수 닫으면 데이터를 더 읽을 수 없습니다.OESwb또한 이는 해결 방법이며,_archive이후 버전에서 제거할 수 있습니다.

닫으려면 파일을 저장해야 합니다.

OESwb.save('filename.xlsx')

이게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/31416842/openpyxl-does-not-close-excel-workbook-in-read-only-mode