用Python模拟curl

3
下面的curl代码是可行的:
curl --form addressFile=@t.csv --form benchmark=Public_AR_Census2010 http://geocoding.geo.census.gov/geocoder/locations/addressbatch

t.csv就是一个简单的

1, 800 Wilshire Blvd, Los Angeles, CA, 90017

我应该如何在Python中模仿这个?到目前为止,我的所有尝试都导致“错误请求”。我还尝试着保持所有内容在内存中,不写入文件。
一个尝试:
import requests
url = "http://geocoding.geo.census.gov/geocoder/json/addressbatch"

# data is csv like string with , and \n
ddata = urllib.urlencode({'addressFile' : data, 'benchmark' : 'Public_AR_Current'})
r = requests.get(url + "?" + ddata) # Forcibly closed by remote

requests.put("http://geocoding.geo.census.gov/geocoder/json/addressbatch", ddata)

你能展示一下你的代码吗? - chrisaycock
1
我在chrisaycock的评论后发布了代码。@MarcB,你的评论甚至没有建设性。 - artdv
1个回答

4

一种选择是使用requests

import requests

url = "http://geocoding.geo.census.gov/geocoder/locations/addressbatch"
data = {'benchmark': 'Public_AR_Census2010'}
files = {'addressFile': open('t.csv')}

response = requests.post(url, data=data, files=files)
print response.content

输出:

"1"," 800 Wilshire Blvd,  Los Angeles,  CA,  90017","Match","Exact","800 Wilshire Blvd, LOS ANGELES, CA, 90017","-118.25818,34.049366","141617176","L"

如果需要在内存中处理csv数据,请初始化一个StringIO缓冲区:

from StringIO import StringIO
import requests

csv_data = "1, 800 Wilshire Blvd, Los Angeles, CA, 90017"
buffer = StringIO()
buffer.write(csv_data)
buffer.seek(0)

url = "http://geocoding.geo.census.gov/geocoder/locations/addressbatch"
data = {'benchmark': 'Public_AR_Census2010'}
files = {'addressFile': buffer}

response = requests.post(url, data=data, files=files)
print response.content

这将打印与使用实际文件相同的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接