У меня есть REST API, в который я пытаюсь загрузить данные, в основном это: https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update
Теперь, так как единственная опция, которую я имею, это PATCH, какие у меня есть варианты оптимизированной загрузки данных. Я был в состоянии загрузить файлы, используя параметр данных и функцию read (), но я не думаю, что это оптимально, поскольку весь файл считывается в память, я думаю. Я попытался использовать параметр files (кодирование формы multipaprt), а также посмотрел на пакет toolbelt, но, похоже, он не работает для PATCH
Это пример кода, который работает, но не является оптимальным
files={'file':('Sample',open('D:/FilePath/Demo.txt','rb'))}
length=os.stat('D:/FilePath/Demo.txt')
filesize=str(length.st_size)
with open('D:/File|Path/Demo.txt','rb') as f:
file_data = f.read()
leng=len(file_data)
header = {
'Authorization': "Bearer " + auth_t
}
header_append = {
'Content-Length': filesize,
'Authorization': "Bearer " + auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}
header_flush = {
'Content-Length': '0',
'Authorization': "Bearer " + auth_t
}
header_read = {
'Authorization': "Bearer " + auth_t
}
try:
init_put=requests.put('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?resource=file&recursive=True', headers=header_flush, proxies=proxies,verify=False)
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)
flush_url='https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=flush&position=' + str(leng)
init_flush=requests.patch(flush_url, headers=header_flush, proxies=proxies,verify=False)
Проблема в линии
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)
Это, кажется, принимает только параметр данных. Если я изменю это на
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,file=files)
Я получаю пустой файл.
То же самое имеет место, когда я использую пакет requestToolbelt.
Патч не распознает параметр файла? Ничто в документах с запросами не говорит об этом.
Кроме того, если параметр данных является единственным выходом, каков наилучший способ загрузки файла без выполнения функции f.read () или итеративного указания количества символов для чтения с использованием f.read (n). Разве нет лучшего способа?