python 2つのオプションを持つWebフォーム-ファイルのアップロードとtextareaがあります。それぞれから値を取得し、それらに渡す必要があります別のコマンドラインプログラム:ファイルアップロードオプションでファイル名を簡単に渡すことができますが、textareaの値を渡す方法がわかりません。
私がする必要があるのは次のとおりだと思います:
一意のファイル名を生成する方法がわかりません。一意のファイル名を生成する方法に関するヒントを教えてください。アルゴリズム、提案、コード行は歓迎します。
ご心配をありがとう
あなたの質問が非常に明確だとは思いませんでしたが、必要なのは一意のファイル名だけである場合...
import uuid
unique_filename = str(uuid.uuid4())
Pythonで一時ファイルを作成する場合は、Pythonの標準ライブラリに tempfile というモジュールがあります。他のプログラムを起動してファイルを操作する場合は、tempfile.mkstemp()を使用してファイルを作成し、os.fdopen()を使用してmkstemp()が提供するファイル記述子にアクセスします。
ちなみに、Pythonプログラムからコマンドを実行していると言いますか?ほとんど確実に サブプロセス モジュールを使用する必要があります。
そのため、次のようなコードを非常に楽しく書くことができます。
import subprocess
import tempfile
import os
(fd, filename) = tempfile.mkstemp()
try:
tfile = os.fdopen(fd, "w")
tfile.write("Hello, world!\n")
tfile.close()
subprocess.Popen(["/bin/cat", filename]).wait()
finally:
os.remove(filename)
これを実行すると、cat
コマンドは完全に機能しましたが、一時ファイルはfinally
ブロックで削除されたことがわかります。 havehave(-===-)がmkstemp()が自分で返す一時ファイルを削除することに注意してください。
(編集:NamedTemporaryFileがあなたが望んでいることを正確に行ったと推測していましたが、それほど便利ではないかもしれません-一時ファイルオブジェクトが閉じられるとすぐにファイルが削除され、閉じる前に他のプロセスがファイルを開くようにします一部のプラットフォーム、特にWindowsでは動作しません。申し訳ありませんが、私の側で失敗します。
uuid
モジュールは良い選択です。ダッシュなしの16進文字列を返すため、ランダムなファイル名としてuuid.uuid4().hex
を使用することを好みます。
import uuid
filename = uuid.uuid4().hex
出力は次のようになります。
>>> import uuid
>>> uuid.uuid()
UUID('20818854-3564-415c-9edc-9262fbb54c82')
>>> str(uuid.uuid4())
'f705a69a-8e98-442b-bd2e-9de010132dc4'
>>> uuid.uuid4().hex
'5ad02dfb08a04d889e3aa9545985e304' # <-- this one
たぶん、一意の一時ファイルが必要ですか?
import tempfile
f = tempfile.NamedTemporaryFile(mode='w+b', delete=False)
print f.name
f.close()
fはファイルを開きます。 delete=False
は、閉じた後にファイルを削除しないことを意味します。
datetime モジュールを使用できます
import datetime
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
注意:多くのオペレーティングシステムでは、コロンはファイル名に使用できないため、replace
を使用しています。
これで、毎回一意のファイル名が与えられます。
私はこの質問に出くわしたので、似たようなものを探しているかもしれない人々のために私のソリューションを追加します。私のアプローチは、ascii
文字からランダムなファイル名を作成することでした。かなりの確率で一意になります。
from random import sample
from string import digits, ascii_uppercase, ascii_lowercase
from tempfile import gettempdir
from os import path
def Rand_fname(suffix, length=8):
chars = ascii_lowercase + ascii_uppercase + digits
fname = path.join(gettempdir(), 'tmp-'
+ ''.join(sample(chars, length)) + suffix)
return fname if not path.exists(fname) \
else Rand_fname(suffix, length)
これはfp.pathモジュールのnique関数を使用して実行できます。
import ufp.path
ufp.path.unique('./test.ext')
現在のパスが「test.ext」ファイルに存在する場合。 ufp.path.unique関数は './test(d1).ext'を返します。