programing

파일이 Excel로 열려 있는 경우 pd.read_excel이 PermissionError를 발생시킵니다.

telebox 2023. 4. 12. 22:13
반응형

파일이 Excel로 열려 있는 경우 pd.read_excel이 PermissionError를 발생시킵니다.

파일을 Excel로 열고 코드를 실행할 때마다 다음과 같은 오류가 발생하는데, 이는 read_excel이 읽기 전용 작업이어야 하고 파일 잠금을 해제할 필요가 없다고 생각했기 때문입니다.

    Traceback (most recent call last):
  File "C:\Users\Public\a.py", line 53, in <module>
    main()
  File "C:\Users\Public\workspace\a.py", line 47, in main
    blend = plStream(rootDir);
  File "C:\Users\Public\workspace\a.py", line 20, in plStream
    df = pd.read_excel(fPath, sheetname="linear strategy", index_col="date", parse_dates=True)
  File "C:\Users\Public\Continuum\Anaconda35\lib\site-packages\pandas\io\excel.py", line 163, in read_excel
    io = ExcelFile(io, engine=engine)
  File "C:\Users\Public\Continuum\Anaconda35\lib\site-packages\pandas\io\excel.py", line 206, in __init__
    self.book = xlrd.open_workbook(io)
  File "C:\Users\Public\Continuum\Anaconda35\lib\site-packages\xlrd\__init__.py", line 394, in open_workbook
    f = open(filename, "rb")
PermissionError: [Errno 13] Permission denied: '<Path to File>'

일반적으로 Excel은 파일을 열 때 많은 제한이 있습니다(같은 파일을 두 번 열 수 없고, 같은 이름의 두 개의 다른 파일을 열 수 없음 등).
테스트할 수 있는 머신에 뛰어난 기능은 없지만 read_excel에 대한 문서를 확인하고 있습니다.이것에 의해, 다음의 설정을 할 수 있는 것을 알 수 있습니다.engine.
업로드한 스택트레이스를 보면 에러가 에러에 의해xlrd팬더들이 사용하는 기본 엔진입니다.

다른 것 중 하나를 사용해 보다

지원되는 엔진: "xlrd", "openpyxl", "odf", "pyxlsb", 기본 "xlrd"

나머지 부분까지 시도해봐

df = pd.read_excel(fPath, sheetname="linear strategy", index_col="date", parse_dates=True, engine="openpyxl")

이게 진짜 답이 아닌 건 알지만, 판다나 xlrd 팀에 버그 보고서를 제출하는 게 좋을 것 같아요.

회피책으로 파이썬이 원본 파일의 복사본을 만들고 복사본에서 읽을 것을 제안합니다.그 후 코드는 복사된 파일을 삭제합니다.그것은 약간의 추가 일이지만 효과가 있을 것이다.

import shutil
shutil.copy("C://Test//Test.xlsx", "C://Test//koko.xlsx")

대신 xlwings 모듈을 사용하면 더 큰 기능을 사용할 수 있습니다.

먼저 다음 행을 사용하여 워크북을 로드해야 합니다.

스프레드시트가 python 스크립트와 동일한 폴더에 있는 경우:

import xlwings as xw
workbook = xw.Book('myfile.xls')

대체 방법:

workbook = xw.Book('"C:\Users\...\myfile.xls')

그런 다음 스프레드시트 내 시트와 데이터셋이 시작되는 셀을 지정하여 Panda DataFrame을 생성할 수 있습니다.

df = workbook.sheets[0].range('A1').options(pd.DataFrame, 
                                            header=1,
                                            index=False, 
                                            expand='table').value

시트를 지정할 때 다음과 같은 방법으로 이름 또는 위치(예: 첫 번째, 두 번째 등)로 시트를 지정할 수 있습니다.

workbook.sheets[0]또는workbook.sheets['sheet_name']

마지막으로 xlwings 모듈을 설치하기 위해서는Pip install xlwings

당신의 코드에는 거의 문제가 없습니다.[코드를 공개하면 더 쉬워집니다]모든 사용자가 읽기 및 쓰기 권한을 가지도록 사용 중인 디렉토리의 권한을 변경해야 합니다.

작업 디렉토리를 설정하고 나서 파일을 열어 이 작업을 실행했습니다.공유 드라이브 권한 및 read_excel 기능과 관련이 있을 수 있습니다.

import os
import pandas as pd

os.chdir("c:\\Users\\...\\")

filepath = "...\\filename.xlsx"
sheetname = 'sheet1'

df_xls = pd.read_excel(filepath, sheet_name=sheetname, engine='openpyxl')

이 오류를 수정하려면 열려 있던 .xlsx 파일을 닫기만 하면 됩니다.

설정할 수 .engine = 'xlrd'Excel이 파일을 열고 있는 동안 코드를 실행할 수 있습니다.

df = pd.read_excel(filename, sheetname, engine = 'xlrd')

할 수도 요.pip install xlrd

또한 파일에 암호가 있는지 확인할 수 있습니다.또는 다음 코드를 사용하여 필요한 암호로 파일을 열 수도 있습니다.

import sys
import win32com.client
xlApp = win32com.client.Dispatch("Excel.Application")
print "Excel library version:", xlApp.Version
filename, password = <-- enter your own filename and password
xlwb = xlApp.Workbooks.Open(filename, Password=password) 
# xlwb = xlApp.Workbooks.Open(filename)
xlws = xlwb.Sheets([insert number here]) # counts from 1, not from 0
print xlws.Name
print xlws.Cells(1, 1) # that's A1

engine='filename'을 설정하면 파일이 열려 있어도 실행할 수 있습니다.

df = pd.read_module(오류, 엔진 = '오류')

언급URL : https://stackoverflow.com/questions/35743905/pd-read-excel-throws-permissionerror-if-file-is-open-in-excel

반응형