我正在尝试使用urllib2来访问在特定http地址发布的.csv文件。我正在使用的代码〜1个月前工作但现在偶尔会挂起.read()命令。我做了各种测试,试图找出罪魁祸首。我尝试访问的地址是公开的天气数据:
.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()函数,但我不知道这是什么以及如何解决它。
谢谢!
答案 0 :(得分:1)
我的猜测是服务器没有正确地遵守请求urllib2发送的Connection: close
标头。您是否尝试过将timeout
arg用于urllib.urlopen
?我不确定它是否会影响read()
操作,或者它是否仅限于实际的连接尝试。