为什么这个文件不会写入文件系统

时间:2013-08-28 15:08:26

标签: python ubuntu io python-2.6

我有一个使用urllib2.urlopen获取文件的python脚本。基本上流程是:

  1. 查找带有if-not-modified标头的文件,如果已经存在的话 修改后,对其进行操作并将其副本写入文件系统

  2. 如果没有,请抓取我们存储的文件的副本本地副本 以前的要求并做了些事情

  3. 如果没有本地副本,则不会修改它 脚本第一次运行所以我们需要做同样的事情 请求没有if-not-modified标头并在本地存储该副本 以及
  4. 最后一部分的代码未按预期工作。请参阅处理下面第三种情况的代码:

    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())似乎是罪魁祸首,但同样的代码在其他地方也可以正常工作。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

问题是你第一次打电话:

document = ET.parse(sourcefileWithNoHeader)

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

sourcefileWithNoHeader.read()

在写之前。

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

contents = StringIO(sourcefileWithNoHeader.read())
ET.parse(contents)
statefile.write(contents.getvalue())