代码之家  ›  专栏  ›  技术社区  ›  intransigent_rocker

偏移量有默认值吗?

  •  1
  • intransigent_rocker  · 技术社区  · 2 年前

    在下面的代码中,如果调用upload_file_2_sp函数,我不确定偏移量参数是如何赋值的。

    代码将按原样成功运行,但我正在尝试向print_upload_progress函数添加第二个参数,以将文件列表循环中的每个文件传递给print_upload _progress功能,这样我就可以在for循环遍历我的文件列表时显示上传进度。不知道该怎么做,因为我不确定偏移量参数的赋值当前是如何工作的。

    local_path = '/sso_win_mounts/win_appsprod/CRMDAGROUP/phones/reporting/customer_care/prod/weekly/kpm/test 3.xlsb'
    
    #display progress of file upload to sharepoint
    def print_upload_progress(offset):
        print(str(offset))
        # type: (int) -> None
        file_size = os.path.getsize(local_path)
        print(
            "Uploaded '{0}' bytes from '{1}'...[{2}%]".format(
                offset, file_size, round(offset / file_size * 100, 2)
            )
        )
    
    #upload files to sharepoint
    def upload_file_2_sp(report_list, base_url, target_url):
        ctx = sharepointConnection(base_url)
    
        target_folder = ctx.web.get_folder_by_server_relative_url(target_url)
        size_chunk = 1000000
    
        for file in report_list:
            uploaded_file = target_folder.files.create_upload_session(
            file, size_chunk, print_upload_progress
            ).execute_query()
    
            print("File {0} has been uploaded successfully".format(uploaded_file.serverRelativeUrl))
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   Barmar    2 年前

    参数由自动传递 create_upload_session() ,你无法改变它所经过的。

    您可以使用lambda将其他参数传递给您的函数。

        for file in report_list:
            uploaded_file = target_folder.files.create_upload_session(
                file, size_chunk, 
                lambda offset, file=file: print_upload_progress(offset, file)
            ).execute_query()
    
            print("File {0} has been uploaded successfully".format(uploaded_file.serverRelativeUrl))
    

    看见 Creating functions (or lambdas) in a loop (or comprehension) 的解释 file=file lambda的参数。

        2
  •  0
  •   Raymond    2 年前

    请参阅的定义 create_upload_session 作用

    def create_upload_session(
            self, file, chunk_size, chunk_uploaded=None, file_name=None, **kwargs
        ):
    

    如果第三个参数是一个函数,则使用以下方法调用它:

    uploaded_bytes = file.tell()
    if callable(chunk_uploaded):
       chunk_uploaded(uploaded_bytes, **kwargs)
    

    然后,第一个参数应该是偏移量(或文件流中的当前文件位置),下面的参数可以用**kwargs发送。因此,您可以将您的print_upload_progress定义为:

    def print_upload_progress(offset,filename):
        print(str(offset))
        # type: (int) -> None
        file_size = os.path.getsize(local_path)
        print(
            filename+" Uploaded '{0}' bytes from '{1}'...[{2}%]".format(
                offset, file_size, round(offset / file_size * 100, 2)
            )
        )
    
    

    并将其用作:

    uploaded_file = target_folder.files.create_upload_session(
            file, size_chunk, print_upload_progress,filename= file.name
            ).execute_query()