पायथन: एक अद्वितीय फ़ाइल नाम कैसे बनाएं?


95

मेरे पास दो विकल्पों के साथ एक अजगर वेब फ़ॉर्म है - फ़ाइल अपलोड और टेक्सारिया । मुझे प्रत्येक से मान लेने और उन्हें दूसरे कमांड-लाइन प्रोग्राम में पास करने की आवश्यकता है। मैं फ़ाइल अपलोड विकल्पों के साथ फ़ाइल नाम आसानी से पास कर सकता हूं, लेकिन मुझे यकीन नहीं है कि टेक्स्टारिया के मूल्य को कैसे पारित किया जाए।

मुझे लगता है कि मुझे क्या करना है:

  1. एक अद्वितीय फ़ाइल नाम उत्पन्न करें
  2. कार्यशील निर्देशिका में उस नाम के साथ एक अस्थायी फ़ाइल बनाएँ
  3. अस्थायी फ़ाइल में textarea से पारित मूल्यों को बचाओ
  4. मेरे अजगर मॉड्यूल के अंदर से कमांडलाइन प्रोग्राम निष्पादित करें और इसे अस्थायी फ़ाइल का नाम दें

मुझे यकीन नहीं है कि एक अद्वितीय फ़ाइल नाम कैसे उत्पन्न किया जाए। क्या कोई मुझे एक अद्वितीय फ़ाइल नाम उत्पन्न करने के लिए कुछ सुझाव दे सकता है? किसी भी एल्गोरिदम, सुझाव, और कोड की पंक्तियों की सराहना की जाती है।

आपकी चिंता के लिए धन्यवाद


1
मैंने आपके प्रश्न को संपादित करने का प्रयास किया और इसे और अधिक स्पष्ट किया। मुझे पता है अगर मैं कुछ गलत व्याख्या की!
पुलि

जवाबों:


147

मुझे नहीं लगता था कि आपका प्रश्न बहुत स्पष्ट था, लेकिन अगर आप सभी की आवश्यकता एक अद्वितीय फ़ाइल नाम है ...

import uuid

unique_filename = str(uuid.uuid4())

क्षमा करें, मैं विंडोज़ प्लेटफ़ॉर्म पर काम कर रहा हूं इसलिए न जाने कैसे
सबप्रोसेस

uuid एक लंबी अनूठी स्ट्रिंग बनाता है। मैं लंबे स्ट्रिंग और UUID, () के साथ फ़ाइल नाम रखना बेहतर नहीं समझता।
मिस्टिककोड्स

6
मुझे लगता है uuid.uuid4().hexकि एक बेहतर विकल्प होगा, यहां विस्तार से देखें ।
ग्रे ली

4
@ToloPalmer: यह अधिक संभावना है कि आपके कंप्यूटर के सीपीयू में एक प्रोसेसिंग त्रुटि है जो गलत फाइल को लोड करने का कारण बनती है, क्योंकि यह उत्पन्न यूयूआईडी किसी भी मौजूदा मूल्य से टकराता है। यूयूआईडी कंप्यूटिंग के एक मॉडल में एक अद्वितीय नाम पैदा करता है जो समझता है कि सभी गणना शुद्ध गणित नहीं है।
GManNickG

2
मेरी अज्ञानतापूर्ण पुरानी टिप्पणी को क्षमा करें ... वास्तव में अद्वितीय नहीं है, लेकिन बहुत टकराने की संभावना नहीं है, इतना अच्छा विकल्प;)
टोलो पामर

51

यदि आप पायथन में अस्थायी फ़ाइलें बनाना चाहते हैं, तो पायथन के मानक पुस्तकालयों में टेम्पोफाइल नामक एक मॉड्यूल है। यदि आप फ़ाइल पर काम करने के लिए अन्य प्रोग्राम लॉन्च करना चाहते हैं, तो फाइल बनाने के लिए tempfile.mkstemp () का उपयोग करें, और mkstemp () आपको प्रदान करने वाले फ़ाइल डिस्क्रिप्टर तक पहुंचने के लिए os.fdopen () का उपयोग करें।

संयोग से, आप कहते हैं कि आप पायथन प्रोग्राम से कमांड चला रहे हैं? आपको निश्चित रूप से सबप्रोसेस मॉड्यूल का उपयोग करना चाहिए ।

तो आप काफी आसानी से ऐसा कोड लिख सकते हैं जो दिखता है:

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ब्लॉक में हटा दिया गया था । ध्यान रखें आपको लगता है कि हो सकता है है पुस्तकालय जब आप इसे पूरा कर चुके हैं जानने का कोई तरीका है - कि mkstemp () अपने आप को देता अस्थायी फ़ाइल को नष्ट करने के लिए!

(संपादित करें: मैंने अनुमान लगाया था कि NamedTemporaryFile ने वास्तव में वही किया है जो आप कर रहे हैं, लेकिन यह इतना सुविधाजनक नहीं हो सकता है - अस्थायी फ़ाइल ऑब्जेक्ट के बंद होने पर फ़ाइल तुरंत हटा दी जाती है, और अन्य प्रक्रियाएँ फ़ाइल को खोलने से पहले बंद कर देती हैं। कुछ प्लेटफ़ॉर्म पर काम नहीं करेंगे, विशेष रूप से विंडोज़। क्षमा करें, मेरी ओर से विफल।)


NamedTemporaryFile का उपयोग संभवतः वे क्या चाहते हैं (जब तक वे इसे सर्वर पर नहीं रखना चाहते हैं, और तब वे "tempfile.NamedTemporaryFile (delete = False)" का उपयोग कर सकते हैं
Terence Honles

क्या मैं उस अस्थायी फ़ाइल का नाम भी अद्वितीय बना सकता हूँ? इसलिए मैं बाद में इसे बचा सकता हूं जब
उपप्रोसेस

@Terence Honles: मैंने मूल रूप से tempfile.NamedTemporaryFile () मूल रूप से सुझाया था, लेकिन आप वास्तव में अस्थायी फ़ाइलों को बनाने के लिए उपयोग नहीं कर सकते जिन्हें अन्य प्रक्रियाएं विंडोज पर एक्सेस कर सकती हैं। NamedTemporaryFile (डिलीट = गलत) निश्चित रूप से क्लीनर है , हालांकि। @ user343934: tempfile.mkstemp () आपको हर बार एक अनोखा नाम देने की गारंटी देता है - यह नामों को बेतरतीब ढंग से उत्पन्न करता है और यह टकराव से बचने के लिए OS सुविधाओं (O_EXCL, यदि आप सोच रहे हैं) का उपयोग करता है।
रिचर्ड बैरेल

वाह मुझे नहीं पता था कि यह खिड़कियों पर काम नहीं करता है ... विफल :( ... मुझे लगता है कि यह जानना अच्छा है
टेरेंस ऑनल्स

@Terence Honles: NamedTemporaryFile () वास्तव में विंडोज पर विफल नहीं होता है (जहां तक ​​मुझे पता है), लेकिन आप फ़ाइल को बिना डिलीट किए भी बंद नहीं कर सकते, और (जैसा कि मैं विंडोज पर फाइल शब्दार्थ समझता हूं) कोई अन्य प्रोग्राम नहीं खोल सकता। आपके पास खुला रहने पर फ़ाइल करें। मैं गलत हो सकता हूं; विंडोज के तहत एक फाइल को साझा करने वाली कई प्रक्रियाओं के लिए शब्दार्थ मैंने पिछले जाँच के बाद बदल दिया है।
रिचर्ड बैरेल

32

uuidमॉड्यूल एक अच्छा विकल्प हो सकता है, मैं का उपयोग करना पसंद 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

1
डैश होने की समस्या क्या है?
डेविड लोपेज

15

शायद आपको अद्वितीय अस्थायी फ़ाइल की आवश्यकता है?

import tempfile

f = tempfile.NamedTemporaryFile(mode='w+b', delete=False)

print f.name
f.close()

f फाइल खोली है। delete=Falseइसका मतलब है कि फाइल को बंद करने के बाद डिलीट न करें।

यदि आपको फ़ाइल के नाम पर नियंत्रण की आवश्यकता है, तो वैकल्पिक prefix=...और suffix=...तर्क हैं जो तार लेते हैं। Https://docs.python.org/3/library/tempfile.html देखें ।


यदि आपको फ़ाइल का नाम नियंत्रित करने की आवश्यकता नहीं है तो यह बहुत अच्छा है।

1
यह tmpfile होना चाहिए। NamedTemporaryFile सिर्फ NamedTemporaryFile नहीं।
user1993015

w+bडिफ़ॉल्ट है mode। किसी भी tempfileकार्यक्षमता का उपयोग करने से गलत फ़ाइल एक्सेस अनुमतियों का नुकसान होता है: मास्क के रूप में tempfileउपयोग करने के लिए दस्तावेज़ os.O_TMPFILE, लेकिन सामान्य फ़ाइल निर्माण सम्मान करता है os.umask()
m8mble

8

आप डेटाइम मॉड्यूल का उपयोग कर सकते हैं

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

ध्यान दें: मैं उपयोग कर रहा हूँ replaceक्योंकि कई ऑपरेटिंग सिस्टमों में फ़ाइल नाम में कॉलोनों की अनुमति नहीं है।

यही है, यह आपको हर बार एक अनूठा फ़ाइल नाम देगा।


2
जब तक फ़ाइल नाम एक दूसरे के तुरंत बाद नहीं बनते हैं (उदाहरण के लिए एक लूप में)। फिर वे वही हैं।
स्कर्र्नस

1

मुझे यह सवाल आया, और मैं उन लोगों के लिए अपना समाधान जोड़ूंगा जो कुछ इसी तरह की तलाश में हैं। मेरा दृष्टिकोण 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
प्रश्न के लिए स्पष्ट उत्तर को uuid पैकेज के साथ करना था। हालाँकि मेरे टारगेट सर्वर में अजगर 2.4 है, कोई भी uuid पैकेज और अपग्रेड नहीं है जो विरासत की सॉफ्टवेयर असंगतताओं के कारण सर्वर मालिक द्वारा अधिकृत नहीं था, इसलिए यह उत्तर मेरे लिए काम करता है।
अल्बर्टो गाओना

1
मैं विशेष रूप से इस जवाब को पसंद करता हूं: आसानी से प्रोजेक्ट ऐनक के लिए ट्वीक किया जा सकता है।
स्वदेव

1
1) यहाँ पुनरावृत्ति का उपयोग करने का कोई कारण नहीं है, विशेष रूप से अनबाउंड। 2) उस समय के बीच दौड़ की स्थिति मौजूद है जो path.exists()रिटर्न करती है Falseऔर उस समय जब कोई उपभोक्ता वास्तव में फ़ाइल खोलता है।
जोनाथन रेनहार्ट

1

यह ufp.path मॉड्यूल में अद्वितीय फ़ंक्शन का उपयोग करके किया जा सकता है ।

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

यदि वर्तमान पथ में 'test.ext' फ़ाइल मौजूद है। ufp.path.unique function return './test (d1) .ext'।


6
ufp ड्रुपल का हिस्सा है? एक मानक मॉड्यूल नहीं
एंडोलिथ

1

यदि मौजूद है तो एक अद्वितीय फ़ाइल पथ बनाने के लिए, फ़ाइल के लिए एक नया स्ट्रिंग नाम उत्पन्न करने के लिए यादृच्छिक पैकेज का उपयोग करें। आप उसी के लिए नीचे दिए गए कोड का उल्लेख कर सकते हैं।

import os
import random
import string

def getUniquePath(folder, filename):    
    path = os.path.join(folder, filename)
    while os.path.exists(path):
         path = path.split('.')[0] + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.' + path.split('.')[1]
    return path

अब आप इस पथ का उपयोग तदनुसार फ़ाइल बनाने के लिए कर सकते हैं।


1

यदि आपको अपने फ़ाइलनाम, प्रयास के रूप में शॉर्ट यूनिक आईडी की आवश्यकता होती है shortuuid, तो shortuuid लोअरकेस और अपरकेस अक्षरों और अंकों का उपयोग करता है, और समान दिखने वाले वर्णों जैसे l, 1, I, O और 0 को हटा रहा है।

>>> import shortuuid
>>> shortuuid.uuid()
'Tw8VgM47kSS5iX2m8NExNa'
>>> len(ui)
22

की तुलना में

>>> import uuid
>>> unique_filename = str(uuid.uuid4())
>>> len(unique_filename)
36
>>> unique_filename
'2d303ad1-79a1-4c1a-81f3-beea761b5fdf'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.