使用Python将文件上传到Sharepoint文件夹

6

我有一个Python脚本,可以将文件保存到服务器共享文件夹中供用户访问。我们的组织最近将服务器文件结构移到了Sharepoint上,包括所有文件夹。(我读过多篇文章说这是个坏主意,但现在无法更改。)

我有新的代码,可以上传文件到Sharepoint库的根文件夹:

import sharepy s = sharepy.connect("site.sharepoint.com", "username", "password") r = s.post("https://site.sharepoint.com/_api/web/Lists/GetByTitle('Documents')/RootFolder/files\ /add(overwrite=true,url='test.csv')", \ "testing,foo,bar") print(r)

是否有一种方法可以将文件上传到子文件夹而不是根目录?如果有,该如何实现?


一个可能作为临时解决方案的选项,但不直接上传到SharePoint的方法是将本地文件夹与SharePoint同步,并让您的Python脚本将文件复制到本地文件夹。只要您已登录以支持同步,您的文件就会被上传到SharePoint并可供其他人使用。 - BalooRM
1
这是真的。我有几个临时解决方案可用,但现在正在努力开发首选解决方案。谢谢! - VMarshall
不用谢。我对这个解决方案很感兴趣。我的问题比较复杂,因为它使用了两步验证,一旦输入正确就会记住以允许同步。当它成为优先事项时,我将稍后回顾。祝你好运。 - BalooRM
谢天谢地,我没有处理双因素认证。下面是我的解决方案。祝你好运! - VMarshall
5个回答

5

如果对任何人有所帮助,这是我的最终代码。它成功地将文件发布到SharePoint网站团队站点库的子文件夹中。用你自己的信息替换斜体部分即可。

import sharepy 

s = sharepy.connect("*MySite*.sharepoint.com", "*username*", "*password*") 

r = s.post("https://*MySite*.sharepoint.com/sites/*TeamSiteName*/_api/web/GetFolderByServerRelativeUrl('/sites/*TeamSiteName*/Shared Documents/*FolderName*')/Files/" + "add(overwrite=true,url='test.csv')", "testing,foo,bar")

print r

3

我曾经研究过相同的问题。以下是我的代码。

import requests
from shareplum import Office365

username = "YourUsername"
password = "YourPassword"
site_name = "Sitename"
doc_library = "SubfolderName"
base_path = "https://domainName.sharepoint.com"

file_name = "FileName"

# Obtain auth cookie
authcookie = Office365(base_path, username=username, password=password).GetCookies()
session = requests.Session()
session.cookies = authcookie
session.headers.update({'user-agent': 'python_bite/v1'})
session.headers.update({'accept': 'application/json;odata=verbose'})

# dirty workaround.... I'm getting the X-RequestDigest from the first failed call
session.headers.update({'X-RequestDigest': 'FormDigestValue'})
response = session.post( url=base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='a.txt',overwrite=true)",
                         data="")
session.headers.update({'X-RequestDigest': response.headers['X-RequestDigest']})

dest =  base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='a.txt',overwrite=true)" #session.post( url=base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='a.txt',overwrite=true)",data="")
print('Folder!')
# perform the actual upload
with open( file_name, 'rb') as file_input:
    try:
        print('uploading')
        response = session.post( 
            url=base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='" 
            + file_name + "',overwrite=true)",
            data=file_input)
    except Exception as err: 
        print("Some error occurred: " + str(err))
print('Uploaded successfully!')

1
以下是我在Databricks中使用Python从Azure Blob存储上传文件到新的Sharepoint子文件夹的代码。
def upload_sharepoint(sp_filepath,blob_file_path):
  from office365.runtime.auth.authentication_context import AuthenticationContext
  from office365.sharepoint.client_context import ClientContext
  from office365.sharepoint.files.file import File
  import os
  
  url='https://<domain>.sharepoint.com/sites/<site1>/<subsite1>'
  username = 'user'
  pwd = 'password'

  ctx_auth = AuthenticationContext(url)
  ctx_auth.acquire_token_for_user(username, pwd)   
  ctx = ClientContext(url, ctx_auth)

  blobpath = '/dbfs' + blob_file_path
  filename=os.path.basename(blob_file_path)
  
  #read content of file
  with open(blobpath, 'rb') as content_file:
    file_content = content_file.read()
  
  target_url = sp_filepath  # sharepoint url to upload a file 
  target_folder=ctx.web.get_folder_by_server_relative_url(target_url)
  try:
    folder_exist=ctx.load(target_folder).execute_query().properties['Exists']
  except Exception as e:
    folder_exist=False
    print('Folder Not Found,Creating Folder')
    
  if !folder_exist:
    try:
      target_folder = ctx.web.folders.add(target_url).execute_query()    #Create the folder, can create folder upto 1 level only
    except Exception as e:
      print('Parent folder Not Found',e)
  target_folder.upload_file(filename, file_content).execute_query()    # upload the file
  print('Uploaded '+filename+' to '+target_url)

以上代码可以用于在已存在的文件夹中创建一个一级子文件夹。

例如,在Sharepoint上,我们将创建一个名为“NewFolder”的文件夹,该文件夹位于已存在的“Pay file”文件夹内:

sharepoint_fp='/sites/<site1>/<subsite1>/Document%20upload/Pay%20file/NewFolder' 
blob_path='/mnt/PayFile/'  
files=spark.createDataFrame(dbutils.fs.ls(blob_path))
files=files.select('name').collect()
for f in files:
  upload_sharepoint(sharepoint_fp,blob_path+f.name)

当我尝试上传一个pandas数据框时,出现以下错误:"类型为DataFrame的对象不可JSON序列化"。你知道可能是为什么吗? - Federico Gentile
@FedericoGentile,你不能直接上传数据框到SharePoint文件夹,你需要先将其写入CSV或Excel文件,然后再上传该文件。 - Anand Maurya

0

我根据您上面提供的“创建文件并将其添加到文件夹”链接修改了我的代码。import sharepy s = sharepy.connect("site.sharepoint.com", "username", "password") r = s.post("https://williamsburghealthfoundati.sharepoint.com/sites/ValerieTest/_api/web/\ GetFolderByServerRelativeUrl('/Folder1')/Files/
add(overwrite=true,url='test.csv')", "testing,foo,bar") print(r)我添加了特定的站点名称,并整合了GetFolderByServerRelativeUrl调用。结果是Response [400]。谢谢!
- VMarshall
400 是错误请求。通常意味着 URL 不正确。 - Baker_Kong
谢谢!我知道我的URL不正确,但找不到正确的组合。我必须在URL中重复sites/TeamSiteName部分和GetFolderByServerRelativeUrl。 - VMarshall

0

经过多次尝试,我终于用比我预期更少的代码行数使这个工作正常运行。

我遇到了一些问题,涉及到一些URL和文件夹路径,所以我加上了“r”来获取原始路径。

from shareplum import Site from shareplum import Office365 from shareplum.site import Version

普通身份验证

authcookie = Office365(r'https://.sharepoint.com', username='@', password='***').GetCookies()

在此处填写您网站的信息

site = Site(r'https://*******.sharepoint.com/sites/sitename/',version=Version.v365, authcookie=authcookie)

在此处只需填写您的文件夹信息

folder = site.Folder('Shared Documents/Your Folder')

来源: https://shareplum.readthedocs.io/en/latest/files.html#folders

编码和错误是可选的

使用以下代码打开文件:

with open(r'C:/Users/Alessandro.paiva/Desktop/file.xlsx', encoding='latin-1', errors='ignore') as file: fileContent = file.read()

文件名称

将文件上传到指定文件夹:

folder.upload_file(fileContent, r'file.xlsx')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接