【问题标题】:pd.read_excel throws PermissionError if file is open in Excel如果文件在 Excel 中打开,pd.read_excel 会抛出 PermissionError
【发布时间】:2016-06-15 02:38:43
【问题描述】:

每当我在 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 中打开时,它给了我这个错误,我的问题是为什么。这不是只读操作吗?
  • 对不起,我错过了那部分。是的,如果 Excel 文件在 Excel 中打开,您甚至无法读取它。您可以尝试使用文件 URL,例如 file://localhost/path/to/workbook.xlsx 看看是否有帮助。
  • @Selcuk:实际上,您可以阅读在 Excel 中打开的工作簿,具体取决于您的方法。例如,如果你直接使用xlrd(而不是通过pandas),你可以这样做。
  • 能否分享一下fPath指向的路径;如果您也可以共享 sn-p,那将非常有帮助。即使在 MS Excel 中打开文件(在 Windows 10 上,Anaconda python=3.5.6,pandas=0.23.4 和 xlrd=1.2.0),pd.read_excel() 也不会报告任何权限问题。跨度>

标签: python excel pandas


【解决方案1】:

一般Excel在打开文件时有很多限制(不能打开同一个文件两次,不能打开2个同名的不同文件..等等)。
我在机器上没有 excel 来测试,但是检查 read_excel 的文档我注意到它允许您设置 engine
从您发布的堆栈跟踪来看,xlrd 似乎引发了错误,这是 pandas 使用的默认引擎。

尝试使用其他任何一种

支持的引擎:“xlrd”、“openpyxl”、“odf”、“pyxlsb”,默认为“xlrd”。

所以试试其他的,比如

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

我知道这不是一个真正的答案,但您可能想向 pandas 或 xlrd 团队提交错误报告。

【讨论】:

    【解决方案2】:

    我建议改用 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】:

    您的代码基本上没有问题。 [如果您发布代码会更容易。] 您需要更改您正在使用的目录的权限,以便所有用户都具有读写权限。

    【讨论】:

      【解决方案4】:

      作为一种解决方法,我建议让 python 创建原始文件的副本,然后从副本中读取。之后,代码应删除复制的文件。这有点额外的工作,但应该可以工作。

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 这个解决方案对我不起作用 - 我得到相同的 PermissionError。
        【解决方案6】:

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

        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
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 我不明白为什么我会得到负分
          • 如果用例是文件可能随时打开,这将无济于事。
          • 如果您可以关闭文件,这确实有效。可能是大多数情况。
          【解决方案8】:

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

          df = pd.read_excel(filename, engine = 'python')

          【讨论】:

          • "未知引擎:python"
          • 不工作,未知引擎
          猜你喜欢
          • 2023-03-18
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          相关资源
          最近更新 更多