如何在Python中使用urllib2上传本地文件?

0 投票
2 回答
3278 浏览
提问于 2025-04-18 06:43

我现在是个完全不懂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也可以用得上。

撰写回答