0

を使用してファイルをフェッチする python スクリプトがありますurllib2.urlopen。基本的な流れは次のとおりです。

  1. ヘッダー付きのファイルを探します。if-not-modified変更されている場合は、それに何かを加えて、ファイル システムにコピーを書き込みます。

  2. そうでない場合は、以前のリクエストで保存したファイルのコピー ローカル コピーを取得し、それに何かを実行します。

  3. ローカル コピーがなく、変更もされていない場合はスクリプトが初めて実行されるため、同じリクエストをif-not-modifiedヘッダーなしで行い、そのコピーもローカルに保存する必要があります。

最後の部分のコードが期待どおりに機能していません。以下の 3 番目のケースを処理するコードを参照してください。

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 に答える