我有一个使用urllib2.urlopen
获取文件的python脚本。基本上流程是:
查找带有if-not-modified
标头的文件,如果已经存在的话
修改后,对其进行操作并将其副本写入文件系统
如果没有,请抓取我们存储的文件的副本本地副本 以前的要求并做了些事情
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())
似乎是罪魁祸首,但同样的代码在其他地方也可以正常工作。任何帮助将不胜感激
答案 0 :(得分:2)
问题是你第一次打电话:
document = ET.parse(sourcefileWithNoHeader)
如果我没弄错的话就是对元素树的调用。这已经读取了文件的内容,因此后续读取将返回空字符串。你可以确认打印结果:
sourcefileWithNoHeader.read()
在写之前。
要解决此问题,只需在解析之前将内容保存到StringIO
contents = StringIO(sourcefileWithNoHeader.read())
ET.parse(contents)
statefile.write(contents.getvalue())