0

cStringIO バッファをディスクに書き込もうとしています。バッファは、pdf、画像、または html ファイルを表す場合があります。

私が取ったアプローチは少し不安定に見えるので、解決策として別のアプローチも受け入れます。

def copyfile(self, destfilepath):
    if self.datastream.tell() == 0:
        raise Exception("Exception: Attempt to copy empty buffer.")
    with open(destfilepath, 'wb') as fp:
        shutil.copyfileobj(self.datastream, fp)
    self.__datastream__.close()

@property
def datastream(self):
    return self.__datastream__

#... inside func that sets __datastream__
while True:
    buffer = response.read(block_sz)
    self.__datastream__.write(buffer)
    if not buffer:
        break
# ... etc ..

test = Downloader()
ok = test.getfile(test_url)
if ok:
   test.copyfile(save_path)

ファイル全体を正常に読み取り、それが私が興味を持っているタイプであることがわかるまで、ディスクへのデータの書き込みを開始したくないため、このアプローチを採用しました。

copyfile() を呼び出した後、ディスク上のファイルは常に 0 バイトです。

4

1 に答える 1

0

おっと!

ストリームから読み取ろうとする前に、ストリームの位置をリセットするのを忘れていました。そのため、最後から読み取っていたため、ゼロバイトです。カーソルを先頭に移動すると、問題が解決します。

def copyfile(self, destfilepath):
    if self.datastream.tell() == 0:
        raise Exception("Exception: Attempt to copy empty buffer.")
    self.__datastream__.seek(0)  # <-- RESET POSITION TO BEGINNING
    with open(destfilepath, 'wb') as fp:
        shutil.copyfileobj(self.datastream, fp)
    self.__datastream__.close()
于 2014-04-29T03:22:21.713 に答える