Wykonuję proste zadanie załadowania pliku za pomocą biblioteki żądań Pythona. Przeszukałem Stack Overflow i wydawało się, że nikt nie ma tego samego problemu, a mianowicie, że plik nie został odebrany przez serwer:
import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)
Wypełniam wartość słowa kluczowego „upload_file” moją nazwą pliku, ponieważ jeśli zostawię to pole puste, zostanie wyświetlone
Error - You must select a file to upload!
A teraz rozumiem
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Który pojawia się tylko wtedy, gdy plik jest pusty. Więc utknąłem, jak pomyślnie wysłać mój plik. Wiem, że plik działa, ponieważ jeśli wejdę na tę stronę i ręcznie wypełnię formularz, zwraca ładną listę dopasowanych obiektów, o co mi chodzi. Naprawdę doceniłbym wszystkie wskazówki.
Kilka innych wątków powiązanych (ale nie odpowiadających na mój problem):
źródło
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Każda krotka to para klucza i wartości.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
ale jeśli używane jest files = {}, to headers = {'Content-Type': 'blah blah'} nie może być używane! -> @ martijn-pieters: ponieważ multipart / form-data Content-Type musi zawierać wartość graniczną używaną do oddzielenia części w treści wiadomości. Brak ustawienia nagłówka Content-Type gwarantuje, że żądania ustawią go na poprawną wartość.requests
to zamyka?with open(...) as fobj:
i użyjfobj
wfiles
mapowaniu.(2018) nowa biblioteka żądań Pythona uprościła ten proces, możemy użyć zmiennej `` files '', aby zasygnalizować, że chcemy przesłać plik zakodowany w wielu częściach
źródło
lsof
wydaje się, że plik pozostaje otwarty, a przynajmniej tak interpretuję poniższe wyniki. Przed uruchomieniemopen
wlsof
tabeli nie ma rekordu ofilename
. Następnie po wykonaniu operacjiopen
pojawia się wiele rekordów zread
dostępem. Po wykonaniu instrukcjirequests.post
nadal istnieją rekordy wskazujące, że plik nie został zamknięty.Przesyłanie przez klienta
Jeśli chcesz przesłać pojedynczy plik z
requests
biblioteką Python , request lib obsługuje przesyłanie strumieniowe , które pozwala na wysyłanie dużych plików lub strumieni bez wczytywania do pamięci .Po stronie serwera
Następnie przechowuj plik na
server.py
boku tak, aby zapisywać strumień do pliku bez ładowania do pamięci. Poniżej znajduje się przykład korzystania z przesyłania plików Flask .Lub użyj analizy danych formularza werkzeug, jak wspomniano w poprawce dotyczącej problemu „ wysyłania dużych plików pochłaniających pamięć ”, aby uniknąć nieefektywnego wykorzystania pamięci przy wysyłaniu dużych plików (plik st 22 GiB w ~ 60 sekund. Zużycie pamięci jest stałe na poziomie około 13 MiB.).
źródło
W Ubuntu możesz aplikować w ten sposób,
aby zapisać plik w jakiejś lokalizacji (tymczasowo), a następnie otworzyć i wysłać go do API
źródło
data
zmiennej?