0

我有一个 python 脚本,它使用urllib2.urlopen. 本质上,流程是:

  1. 查找带有if-not-modified标题的文件,如果已修改,对其进行处理并将其副本写入文件系统

  2. 如果没有,请获取我们存储在先前请求中的文件的本地副本并对其进行处理

  3. 如果没有本地副本并且它没有被修改,那么它是脚本第一次运行,所以我们需要发出相同的请求而没有if-not-modified标头并将该副本也存储在本地

最后一部分的代码没有按预期工作。请参阅下面处理第三种情况的代码:

except IOError, e:
    #This is the first attempt to download the file.
    pathWithNoHeader = ROOT_PATH + uri 
    requestWithNoHeader = urllib2.Request(pathWithNoHeader)
    sourcefileWithNoHeader = urllib2.urlopen(requestWithNoHeader)
    document = ET.parse(sourcefileWithNoHeader)
    dir = os.path.dirname(__file__)
    statefile = open(os.path.join(dir, STATE_FILES) + uri, 'w+')
    statefile.write(sourcefileWithNoHeader.read())
    statefile.close()

这成功地获取了文件(我知道,因为我正在尝试处理信息的其他事情正在成功)但是将文件写入文件系统失败并且没有错误。本质上,文件已创建,但它是空的。我是 Python 新手(几个月),对此我完全感到困惑。statefile.write(sourcefileWithNoHeader.read())似乎是罪魁祸首,但同样的代码在其他地方也能正常工作。任何帮助,将不胜感激

4

1 回答 1

2

问题是您首先调用:

document = ET.parse(sourcefileWithNoHeader)

如果我没记错的话是对元素树的调用。这将已经读取文件的内容,因此后续读取将返回空字符串。您可以确认此打印结果:

sourcefileWithNoHeader.read()

在写之前。

要解决这个问题,只需StringIO在解析之前将内容保存到

contents = StringIO(sourcefileWithNoHeader.read())
ET.parse(contents)
statefile.write(contents.getvalue())
于 2013-08-28T15:16:56.793 回答