从HTTP访问.csv文件时,Urllib2 .read()挂起

时间:2013-05-21 22:17:31

标签: python http urllib

我正在尝试使用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()函数,但我不知道这是什么以及如何解决它。

谢谢!

1 个答案:

答案 0 :(得分:1)

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