web-dev-qa-db-ja.com

Python:一意のファイル名を作成する方法は?

python 2つのオプションを持つWebフォーム-ファイルのアップロードtextareaがあります。それぞれから値を取得し、それらに渡す必要があります別のコマンドラインプログラム:ファイルアップロードオプションでファイル名を簡単に渡すことができますが、textareaの値を渡す方法がわかりません。

私がする必要があるのは次のとおりだと思います:

  1. 一意のファイル名を生成する
  2. 作業ディレクトリにその名前で一時ファイルを作成します
  3. Textareaから渡された値を一時ファイルに保存します
  4. My pythonモジュール内からコマンドラインプログラムを実行し、一時ファイルの名前を渡します

一意のファイル名を生成する方法がわかりません。一意のファイル名を生成する方法に関するヒントを教えてください。アルゴリズム、提案、コード行は歓迎します。

ご心配をありがとう

80
MysticCodes

あなたの質問が非常に明確だとは思いませんでしたが、必要なのは一意のファイル名だけである場合...

import uuid

unique_filename = str(uuid.uuid4())
123
EnigmaCurry

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では動作しません。申し訳ありませんが、私の側で失敗します。

49
Richard Barrell

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
21
Grey Li

たぶん、一意の一時ファイルが必要ですか?

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を使用しています。

これで、毎回一意のファイル名が与えられます。

6
Nimish Agrawal

私はこの質問に出くわしたので、似たようなものを探しているかもしれない人々のために私のソリューションを追加します。私のアプローチは、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)
1
behzad.nouri

これはfp.pathモジュールのnique関数を使用して実行できます。

import ufp.path
ufp.path.unique('./test.ext')

現在のパスが「test.ext」ファイルに存在する場合。 ufp.path.unique関数は './test(d1).ext'を返します。

1
c2o93y50