1

インターネットからxlsファイルをダウンロードしています。.xls形式ですが、「Sheet1」をcsv形式にする必要があります。xlrdを使用して変換を行いますが、書き込み先のファイルが空であるという問題が発生したようです。

import urllib2
import tempfile
import csv
import xlrd

url_2_fetch = ____
u = urllib2.urlopen(url_2_fetch)
wb = xlrd.open_workbook(file_contents=u.read())
sh = wb.sheet_by_name('Sheet1')
csv_temp_file = tempfile.TemporaryFile()
with open('csv_temp_file', 'wb') as f:
    writer = csv.writer(f)
    for rownum in xrange(sh.nrows):
        writer.writerow(sh.row_values(rownum))

それはうまくいったようです。しかし、今度は次のようにして値を調べたいと思います。

with open('csv_temp_file', 'rb') as z:
    reader = csv.reader(z)
    for row in reader:
        print row

しかし、私は何も得られません:

>>> with open('csv_temp_file', 'rb') as z:
...     reader = csv.reader(z)
...     for row in reader:
...             print row
...
>>>

コンテンツの解析をさらに実行してから、SQLAlchemyを使用してcsv投稿のコンテンツをmySQLデータベースにさらに解析したいので、一時ファイルを使用しています。

私は助けに感謝します。ありがとうございました。

4

1 に答える 1

3

これは完全に間違っています:

csv_temp_file = tempfile.TemporaryFile()
with open('csv_temp_file', 'wb') as f:
    writer = csv.writer(f)

このtempfile.TemporaryFile()呼び出しは、「一時記憶域として使用できるファイルのようなオブジェクトです。ファイルは、閉じられるとすぐに破棄されます(オブジェクトがガベージコレクションされた場合の暗黙的な閉じを含む)」を返します。

したがって、変数csv_temp_fileには、読み取りと書き込みが可能な、すでに開いているファイルオブジェクトが含まれており、変数を呼び出し.close()たり、変数を上書きしたり、プログラムを正常に終了したりするとすぐに削除されます。

ここまでは順調ですね。with open('csv_temp_file', 'wb')しかし、次に、一時ファイルではなく、スクリプトの現在のディレクトリに固定名で作成され、'csv_temp_file'このスクリプトが実行されるたびに上書きされ、セキュリティホール、奇妙なバグ、競合状態を引き起こす可能性がある別のファイルを開きます。csv_temp_file何らかの形で変数に関連しています。

with openステートメントをゴミ箱に捨てて、csv_temp_fileすでに持っている変数を使用する必要があります。.seek(0)csvリーダーで再度使用する前に試してみることができます。動作するはずです。使い終わったら呼び出し.close()てください。一時ファイルが削除されます。

于 2013-03-17T01:13:51.733 に答える