如果文件在Excel中打开,pd.read_excel将抛出PermissionError

时间:2016-03-02 10:01:27

标签: python excel pandas

每当我在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>'

7 个答案:

答案 0 :(得分:1)

通常,Excel在打开文件时有很多限制(不能两次打开相同的文件,不能打开两个具有相同名称..etc的不同文件)。
我没有要测试的计算机上的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团队提交错误报告。

答案 1 :(得分:0)

您可以设置engine = 'xlrd',然后在Excel打开文件时运行代码。

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

如果没有,可能需要pip install xlrd

答案 2 :(得分:0)

我建议改用xlwings模块,这样可以提供更多功能。

首先,您需要使用以下行来加载工作簿:

如果电子表格与python脚本位于同一文件夹中

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

或者:

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

然后,您可以通过在电子表格中指定工作表以及数据集开始的单元格来创建Pandas DataFrame:

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

指定工作表时,您可以按以下方式通过其名称或位置(即第一,第二等)来指定工作表:

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

最后,您可以使用Pip install xlwings

来简单地安装xlwings模块。

答案 3 :(得分:0)

大多数情况下,您的代码中没有问题。 [如果发布代码,它将更加容易。] 您需要更改所使用目录的权限,以便所有用户都具有读写权限。

答案 4 :(得分:-1)

您可能还想检查文件是否有密码?或者,您可以使用以下代码使用所需的密码打开文件:

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

答案 5 :(得分:-1)

我只需关闭打开的 .xlsx 文件即可修复此错误。

答案 6 :(得分:-2)

您可以设置engine ='python'然后即使文件已打开也可以运行

df = pd.read_excel(文件名,引擎='python')