2015-04-21 49 views
5

我想使用Python的請求庫,在Python 3。我試圖把它像這樣發送一個文件在POST要求:如何上傳使用Python-要求的文本文件,而不寫入磁盤

import requests 

file_content = 'This is the text of the file to upload' 

r = requests.post('http://endpoint', 
    params = { 
     'token': 'api_token', 
     'message': 'message text', 
    }, 
    files = {'filename': file_content}, 
) 

但是,服務器響應沒有文件被髮送。這應該工作嗎?大多數例子都涉及到傳遞一個文件對象,但我不想將這個字符串寫入磁盤上傳它。

回答

1

事實證明,它沒有工作的原因與文件內容無關,而是我通過HTTP發送請求,而不是HTTPS,而HTTPS正在丟失整個請求。

4

爲什麼不使用cStringIO

import requests, cStringIO 

file_content = 'This is the text of the file to upload' 

r = requests.post('http://endpoint', 
    params = { 
    'token': 'api_token', 
    'message': 'tag_message', 
    }, 
    files = {'filename': cStringIO.StringIO(file_content)}, 
) 

我覺得requests使用類似於我們用文件使用的人的一些方法。 cStringIO提供了它們。用法


>>> from cStringIO import * 
>>> a=StringIO("hello") 
>>> a.read() 
'hello' 
+1

感謝您的建議。因爲我使用的是Python 3,所以它在'io'模塊中:'io.StringIO' – Dov

4

requests docs爲我們提供了這一點:

如果你願意,你可以將字符串發送到接收的文件:

>>> url = 'http://httpbin.org/post' 
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} 

>>> r = requests.post(url, files=files) 
>>> r.text 
{ 
    ... 
    "files": { 
    "file": "some,data,to,send\\nanother,row,to,send\\n" 
    }, 
    ... 
} 

我發佈它作爲另一個答案,因爲它涉及不同的方法。

+0

謝謝,我在文檔中錯過了它。 – Dov

+0

不錯!謝謝,需要編寫一些測試,每次更改名稱/數據。 – rprasad

相關問題