27

テキストファイルの操作と作成に「tempfile」モジュールを使用しようとしています。ファイルの準備ができたら、ディスクに保存します。'shutil.copy'を使用するのと同じくらい簡単だと思いました。ただし、「許可が拒否されました」IOErrorが発生します。

>>> import tempfile, shutil
>>> f = tempfile.TemporaryFile(mode ='w+t')
>>> f.write('foo')
>>> shutil.copy(f.name, 'bar.txt')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    shutil.copy(f.name, 'bar.txt')
  File "C:\Python25\lib\shutil.py", line 80, in copy
    copyfile(src, dst)
  File "C:\Python25\lib\shutil.py", line 46, in copyfile
    fsrc = open(src, 'rb')
IOError: [Errno 13] Permission denied: 'c:\\docume~1\\me\\locals~1\\temp\\tmpvqq3go'
>>> 

'tempfile'ライブラリを使用する場合、これは意図されていませんか?これを行うためのより良い方法はありますか?(たぶん私は非常に些細なことを見落としています)

4

4 に答える 4

43

ホップは正しく、dF. エラーが発生する理由については正しくありません。

まだ電話していないためf.close()、ファイルは削除されません

ドキュメントは次のようにNamedTemporaryFile述べています。

名前付きの一時ファイルがまだ開いている間に、その名前を使用してファイルを 2 度目に開くことができるかどうかは、プラットフォームによって異なります (Unix では使用できますが、Windows NT 以降では使用できません)。

そしてのためにTemporaryFile

Unix では、ファイルのディレクトリ エントリは、ファイルが作成された直後に削除されます。他のプラットフォームはこれをサポートしていません。コードは、この関数を使用して作成された一時ファイルに依存してはなりません。ファイル システムに名前が表示されているかどうかはわかりません。

したがって、(Windows で) 一時ファイルを永続化するには、次の操作を実行できます。

import tempfile, shutil
f = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
f.write('foo')
file_name = f.name
f.close()
shutil.copy(file_name, 'bar.txt')
os.remove(file_name)

copyfileobjファイル名ではなく、ファイルのようなオブジェクトからファイルのようなオブジェクトにのみコピーするため、Hans Sjunnesson が提供するソリューションも無効です。

shutil.copyfileobj(fsrc, fdst[, 長さ])

ファイルのようなオブジェクト fsrc の内容をファイルのようなオブジェクト fdst にコピーします。整数長が指定されている場合は、バッファ サイズです。特に、負の長さの値は、チャンク内のソース データをループせずにデータをコピーすることを意味します。デフォルトでは、制御されていないメモリ消費を避けるために、データはチャンクで読み取られます。fsrc オブジェクトの現在のファイル位置が 0 でない場合、現在のファイル位置からファイルの末尾までの内容のみがコピーされることに注意してください。

于 2012-02-06T04:19:42.517 に答える
21

TemporaryFileまたはで作成したファイルNamedTemporaryFileは、閉じると自動的に削除されるため、エラーが発生します。これが不要な場合は、代わりに使用できます( tempfilemkstempのドキュメントを参照してください)。

>>> import tempfile, shutil, os
>>> fd, path = tempfile.mkstemp()
>>> os.write(fd, 'foo')
>>> os.close(fd)
>>> shutil.copy(path, 'bar.txt')
>>> os.remove(path)
于 2008-09-18T16:45:37.793 に答える
13

Python 2.6以降NamedTemporaryFileでは、delete=オプションをFalseに設定して使用することもできます。このようにして、一時ファイルを閉じた後でもアクセスできるようになります。

Windows(NT以降)では、ファイルが開いている間はファイルに再度アクセスできないことに注意してください。コピーする前に閉じる必要があります。これはUnixシステムには当てはまりません。

于 2008-09-20T22:15:33.667 に答える
6

例では、常にshutil.copyfileobjを使用できます。

new_file = open('bar.txt', 'rw')
shutil.copyfileobj(f, new_file)
于 2008-09-18T16:33:46.620 に答える