用python中的openpyxl读取存储在sharepoint位置上的xlsx?

2024-05-29 11:04:52 发布

您现在位置:Python中文网/ 问答频道 /正文

快一点。

我的XLSX文件位于sharepoint驱动器上,无法在python中使用openpyxl打开它,如果它存储在本地驱动器上,那么它可以正常工作。

我试过了。

from openpyxl import load_workbook
wb = load_workbook('https://content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx')

引发此异常:

C:\Anaconda\lib\site-packages\openpyxl\reader\excel.py in load_workbook(filename, use_iterators, keep_vba, guess_types, data_only)
    123     except (BadZipfile, RuntimeError, IOError, ValueError):
    124         e = exc_info()[1]
--> 125         raise InvalidFileException(unicode(e))
    126     wb = Workbook(guess_types=guess_types, data_only=data_only)
    127 

InvalidFileException: [Errno 22] invalid mode ('rb') or filename: 'https://...

我遗漏了什么吗? 我需要用python阅读其中一张表的内容。


编辑:

根据crussell的建议,我收到未经授权的401通知:

import requests
import urllib
from openpyxl import load_workbook
from requests.auth import HTTPBasicAuth

file = "https://content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx"

username = 'PotatoUser'
password = 'PotatoPassword'

resp=requests.get(file, auth=HTTPBasicAuth(username, password))
print(resp.content)

似乎sharepoint和请求不兼容,既有摘要身份验证,也有基本身份验证 http://docs.python-requests.org/en/latest/user/authentication/


Tags: fromhttpsimportonlydataloadcontentrequests
3条回答

如果SP是内部的,则可以通过删除load_workbook()中输入的名称中的“https:”来工作。

from openpyxl import load_workbook
file = '//content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx'
wb = load_workbook(file)

如果您的工作帐户直接连接到SP,则不进行身份验证。否则,在我的工作中,我们使用NTML身份验证,这可以通过使用库中的HttpNtlmAuth来完成。

让我知道它是否有效,或者如果您仍然对这个问题感兴趣,我可以给您举一个request_ntml的例子

您可能首先需要下载它,而不是直接打开它。应采用以下方法:

import urllib2
from openpyxl import load_workbook
import StringIO

data = urllib2.urlopen("https://content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx")
xlsx = data.read()
wb = load_workbook(StringIO.StringIO(xlsx))

Python的StringIO可用于使下载的数据显示为文件接口。

尝试使用urllib而不是直接从web地址加载。

import urllib
file = "https://content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx"
urllib.urlretrieve(file,"test.xlsx")

从进一步的研究来看,urllib显然被requests所回避

import requests
from requests.auth import HTTPBasicAuth
file = "https://content.potatocompany.com/workspaces/PotatoTeam/Shared Documents/XYZ errors/XYZ Errors_Confirm.xlsx"

username = 'myUsername'
password = 'myPassword'

resp=requests.get(file, auth=HTTPBasicAuth(username, password))
output = open('test.xlsx', 'wb')
output.write(resp.content)
output.close()

要安装请求:

pip install requests

相关问题 更多 >

    热门问题