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
'programing' 카테고리의 다른 글
ASP.NET 리피터 바인딩 목록 (0) | 2023.04.29 |
---|---|
컨트롤러/뷰에 대한 ASP MVChref (0) | 2023.04.29 |
xcode에서 Base SDK, iOS 배포 대상, Target, Project의 의미는 무엇입니까? (0) | 2023.04.29 |
전자 메일 주소를 기본 키로 사용하시겠습니까? (0) | 2023.04.29 |
MongoDB 찾기 성능: 단일 복합 인덱스 VS 두 개의 단일 필드 인덱스 (0) | 2023.04.29 |