0

我正在尝试使用 urllib2 访问发布在特定 http 地址的 .csv 文件。我使用的代码大约在 1 个月前工作,但现在会偶尔挂在 .read() 命令上。我已经进行了各种测试以试图确定罪魁祸首。我试图访问的地址是来自以下位置的公开天气数据:

http://climate.weatheroffice.gc.ca/climateData/bulkdata_e.html?StationID=47267&hlyRange=2008-07-15|2013-03-20&timeframe=1&Prov=ONT&format=csv&Year=2008&Day=15&Month=9

.readline() 函数每次都有效,因此我编写了以下测试以查看读取过程在文件中的结束位置:

foo=urllib2.urlopen(HTTPadress)
for i in range(1000): print i,dd.readline()

这将打印出每一行,直到程序挂起。如果挂起,它将每次都在同一行,并且这一行没有特殊的格式或字符(通常在 680 行左右)。对于不同的数据文件,它将挂在不同的行,但对于同一个文件总是相同的。

我实际使用的代码是用于循环多个数据文件的更大函数的一部分:

def qry(query):
data =   urllib2.urlopen('http://climate.weatheroffice.gc.ca/climateData/bulkdata_e.html?'+query)
    print 'done'
    #pdb.set_trace()
    time.sleep(5)
    tmp=data.read()
    return tmp  

urlopen 和 read 函数之间的 sleep 函数似乎提高了一段时间的可靠性,当我通过 pdb 运行它时,这个函数通常可以工作。在这一点上,我相当确信服务器端发生了一些变化,干扰了 .read() 函数,但我不知道这是什么以及如何解决它。

谢谢!

4

1 回答 1

1

我的猜测是服务器没有正确遵守Connection: closeurllib2 发送的请求中的标头。您是否尝试过使用timeoutarg to urllib.urlopen?不过,我不确定它是否会影响read()操作,或者它是否仅限于实际的连接尝试。

于 2013-05-21T22:25:42.970 回答