如何在Python中使用urllib2上传本地文件?
我现在是个完全不懂Python的新手,想用urllib2来运行和cURL一样的命令。我希望能写一个Python脚本,运行后能和下面这个在终端里的cURL命令做完全相同的事情:
curl -k -F docfile=@myLocalFile.csv http://myWebsite.com/extension/extension/extension
我在一个教程页面上找到了下面这个模板:
import urllib
import urllib2
url = "https://uploadWebsiteHere.com"
data = "{From: 'sender@email.com', To: 'recipient@email.com', Subject: 'Postmark test', HtmlBody: 'Hello dear Postmark user.'}"
headers = { "Accept" : "application/json",
"Conthent-Type": "application/json",
"X-Postmark-Server-Token": "abcdef-1234-46cc-b2ab-38e3a208ab2b"}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
但是我对'数据'和'头部'这两个变量完全搞不懂。urllib2的文档里(https://docs.python.org/2/library/urllib2.html)把'数据'的输入定义为“一个字符串,用来指定要发送给服务器的额外数据”,而'头部'的输入则定义为“一个字典”。我在看这个文档时完全迷糊了,不明白为什么需要一个字典,而我在终端里只需要指定文件和网址就能完成同样的任务。大家有什么想法吗?
2 个回答
1
我想要的是一个Python脚本,当运行时,它能做和下面这个在终端中执行的cURL命令完全一样的事情:
$ curl -k -F docfile=@myLocalFile.csv https://myWebsite.com/extension...
curl -F
是用来发送文件的,使用的是 multipart/form-data
这种内容类型。你可以很简单地用 requests
库来实现这个功能:
import requests # $ pip install requests
with open('myLocalFile.csv','rb') as input_file:
r = requests.post('https://myWebsite.com/extension/...',
files={'docfile': input_file}, verify=False)
verify=False
是用来模拟 curl -k
的效果。
1
你发送的数据看起来不是有效的JSON格式。假设服务器需要的是有效的JSON,你应该修改一下。
你的curl
命令没有传递任何可选的头信息,所以在请求中你不需要提供太多内容。如果你想确认具体的头信息,可以在curl
命令中加上-vi
,然后在Python代码中直接对比这些头信息。或者,我用这个方法也能成功:
import urllib2
url = "http://localhost:8888/"
data = '{"From": "sender@email.com", "To": "recipient@email.com", "Subject": "Postmark test", "HtmlBody": "Hello dear Postmark user."}'
headers = {
"Content-Type": "application/json"
}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
其实,使用requests
库会更好,但对于这么简单的事情,标准库中的urllib2
也可以用得上。