2010-06-02 32 views
51

İki seçenekli bir python web formum var - Dosya yükleme ve textarea. Her birinden değerleri alıp başka bir komut satırı programına aktarmam gerekiyor. Dosya adını dosya yükleme seçenekleriyle kolayca iletebilirim, ancak textarea'nın değerini nasıl geçeceğimi bilmiyorum.Python: Benzersiz bir dosya adı nasıl oluşturulur?

  1. çalışma dizinine
  2. kaydet geçici içine textarea geçirilen değerleri bu adı taşıyan geçici bir dosya oluşturun benzersiz bir dosya adı
  3. oluştur:

    ne yapmam gerekiyor olduğunu düşünüyorum

  4. benim piton modülünden içinden komut programını çalıştırın dosya ve geçici dosyanın o adı geçmesi

Benzersiz bir dosya adı nasıl oluşturulacağından emin değilim. Bana benzersiz bir dosya adı oluşturmak için bana bazı ipuçları verebilir miyim? Herhangi bir algoritma, öneri ve kod satırı takdir edilir. ilgin için

Teşekkür

+1

ben denemek ve daha net bir hale getirmek için sorunuzu düzenlenebilir. Yanlış bir şey yorumlamış olsaydım haberim olsun! – culix

cevap

82
Ben senin soru çok açıktı, ama düşünmüyordu

tek ihtiyacınız benzersiz dosya adı ise ... Eğer geçici dosyaları olmak için

import uuid 

unique_filename = str(uuid.uuid4()) 
+0

Sorularımı daha iyi anlayabilmem gerekir mi? – MysticCodes

+0

Windows platformunda çalışıyorum üzgünüm, bu yüzden alt işlemin nasıl işleneceğini bilmiyorum – MysticCodes

+0

uuid, uzun, benzersiz bir dize oluşturuyor gibi görünüyor. Ben uzun dize ve UUID,() içinde dosya adı sahip daha iyi düşünmüyorum. – MysticCodes

41

Python'da, Python'un standart kütüphanelerinde tempfile adlı bir modül var. Dosyada çalışmak için başka programlar başlatmak istiyorsanız, dosyaları oluşturmak için tempfile.mkstemp() öğesini ve mkstemp() öğesinin size sağladığı dosya tanımlayıcılarına erişmek için os.fdopen() öğesini kullanın.

Bu arada, bir Python programından komutlar çalıştırıyorsunuz diyorsunuz? Neredeyse kesinlikle subprocess modülünü kullanmalısınız.

Yani oldukça neşeyle benziyor kodu yazabilirsiniz: Eğer cat komut gayet iyi çalıştı bulmak gerektiğini Running

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) 

ancak geçici dosya finally blokta silindi. 'un mkstemp() öğesinin kendiliğinden döndüğü geçici dosyayı silmek için'un bulunduğunu unutmayın - kitaplık bittiğinde bunu bilmenin bir yolu yoktur!

(Düzenle: NamedTemporaryFile öğesinin tam olarak ne yaptığınızı yaptığına kanaat getirdim, ancak bu çok kullanışlı olmayabilir - dosya geçici olarak silinen nesne dosyası kapatıldığında ve diğer işlemlerin dosyayı açmadan önce silinmesi 'kapalı, bazı platformlarda, özellikle Windows üzerinde çalışmayacak. Üzgünüm, benim üzerimde başarısız.)

+0

muhtemelen (sunucu üzerinde kalmak ve "tempfile.NamedTemporaryFile (delete = False)" kullanabilirler 0) –

+0

Geçici dosya adını da benzersiz yapabilir miyim? böylece alt işlemin benzersiz bir adla tamamlandığını daha sonra kaydedebilirim – MysticCodes

+0

@Terence Honles: Orijinal olarak tempfile.NamedTemporaryFile() öğesini önerdim, ancak diğer işlemleri Windows'ta erişebilecekleri geçici dosyalar yapmak için bunu kullanamazsınız. NamedTemporaryFile (silme = Yanlış) kesinlikle * temizleyici * olsa da. @ user343934: tempfile.mkstemp(), her çağrıldığında size benzersiz bir isim vermeyi garanti eder - isimleri rastgele üretir ve çarpışmaları önlemek için OS tesislerini (merak ediyorsanız O_EXCL) kullanır. –

2

Bu soruya rastladım ve benzer bir şey arayanlar için çözümümüzü ekleyeceğim. Benim yaklaşımım sadece ascii karakterlerinden rastgele bir dosya adı oluşturmaktı. İyi bir olasılıkla benzersiz olacak.

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

Sorunun açık cevabı uuid paketi ile ilgili idi. Ancak hedef sunucum 2.4 python'una sahip, uuid paketi yok ve güncelleme, eski yazılım uyumsuzlukları nedeniyle sunucu sahibi tarafından onaylanmadı, bu yüzden bu cevap benim için işe yarıyor. –

+1

Özellikle bu cevabı beğeniyorum: proje özelliklerine kolayca uyarlanabilir. – swdev

+0

1) Burada özellikle özensiz olan özyineleme kullanmanın bir nedeni yok. 2) 'path.exists()' 'False' döndürdüğü zaman ile bir tüketicinin dosyayı açtığı zaman arasında yarış durumu vardır. –

8

Belki de geçici bir dosyaya mı ihtiyacınız var? f dosya açılmıştır. delete=False, kapatıldıktan sonra dosyayı silmediğiniz anlamına gelir.

+0

Dosyanın adını kontrol etmeniz gerekmiyorsa bu harikadır. – hiwaylon

+1

Tmpfile olmalıdır.NamedTemporaryFile sadece NamedTemporaryFile. – user1993015

2

Bu, benzersiz işlevini ufp.path modülünde kullanarak yapılabilir. Geçerli yol 'test.ext' dosyası varsa

. ufp.path.unique işlevi döndür. './test (d1) .ext'. iki nokta üst üste birçok işletim sistemlerinde dosya adları izin verilmez çünkü ben replace kullanıyorum : Generate unique path at filepath or dirpath [Python]

+2

ufp drupal'nin bir parçası mı? standart bir modül değil – endolith

2

Sen datetime modülünü o

import datetime 
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.') 

Not kullanabilirsiniz:

örnek görüyoruz.

Bu, size her seferinde benzersiz bir dosya adı verecektir. o tire olmadan bir onaltılık dize dönecektir çünkü

6

uuid modül ben uuid.uuid4().hex olarak rasgele bir dosya adı kullanmayı tercih iyi bir seçim olacaktır.

import uuid 
filename = uuid.uuid4().hex 

çıkışlar böyle olmalıdır:

>>> import uuid 
>>> uuid.uuid() 
UUID('20818854-3564-415c-9edc-9262fbb54c82') 
>>> str(uuid.uuid4()) 
'f705a69a-8e98-442b-bd2e-9de010132dc4' 
>>> uuid.uuid4().hex 
'5ad02dfb08a04d889e3aa9545985e304' # <-- this one 
İlgili konular