पायथन में यादृच्छिक फ़ाइल नाम उत्पन्न करने का सबसे अच्छा तरीका


97

पायथन में, एक फ़ाइल (नाम) को प्रस्तुत करने के लिए कुछ यादृच्छिक पाठ उत्पन्न करने के लिए एक अच्छा, या सबसे अच्छा तरीका क्या है जो मैं एक सर्वर पर सहेज रहा हूं, बस यह सुनिश्चित करने के लिए कि यह ओवरराइट नहीं करता है। धन्यवाद!

जवाबों:


109

पायथन में अस्थायी फ़ाइल नाम जनरेट करने की सुविधा है, http://docs.python.org/library/tempfile.html देखें । उदाहरण के लिए:

In [4]: import tempfile

प्रत्येक कॉल tempfile.NamedTemporaryFile()एक अलग अस्थायी फ़ाइल में परिणाम करती है, और इसका नाम .nameविशेषता के साथ एक्सेस किया जा सकता है , जैसे:

In [5]: tf = tempfile.NamedTemporaryFile()
In [6]: tf.name
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i'

In [7]: tf = tempfile.NamedTemporaryFile()
In [8]: tf.name
Out[8]: 'c:\\blabla\\locals~1\\temp\\tmpr8vvme'

एक बार आपके पास अद्वितीय फ़ाइल नाम होने के बाद इसे किसी भी नियमित फ़ाइल की तरह उपयोग किया जा सकता है। नोट : डिफ़ॉल्ट रूप से फ़ाइल बंद होने पर हटा दी जाएगी । हालाँकि, यदि deleteपैरामीटर गलत है, तो फ़ाइल स्वचालित रूप से हटा नहीं है।

पूर्ण पैरामीटर सेट:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

अस्थायी फ़ाइल के लिए उपसर्ग को निर्दिष्ट करना भी संभव है (फ़ाइल निर्माण के दौरान आपूर्ति किए जा सकने वाले विभिन्न मापदंडों में से एक):

In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'

अस्थायी फ़ाइलों के साथ काम करने के लिए अतिरिक्त उदाहरण यहां देखे जा सकते हैं


1
क्या अगली बार जब मैं अपनी मशीन को पुनः आरंभ करूंगा तो वे फाइलें डिलीट हो जाएंगी?
हैलोवर्ल्ड

15
इस समाधान के साथ समस्या यह है कि यह न केवल एक फ़ाइल नाम उत्पन्न करता है, बल्कि एक फ़ाइल भी है जो पहले से खुली है। यदि आपको एक नए के लिए एक अस्थायी फ़ाइल नाम की आवश्यकता है, तो अभी तक मौजूदा फ़ाइल (जैसे, ओएस कमांड के आउटपुट के रूप में उपयोग करने के लिए), यह नहीं चलेगा। उस स्थिति में, आप str (uuid.uuid4 ()) जैसा कुछ कर सकते हैं।
लुका

@ लुका अतिरिक्त टिप्पणी के लिए धन्यवाद, जो उपयोगी है, और भविष्य के संदर्भ के लिए विख्यात है। हालांकि, ओपी ने स्पष्ट रूप से कहा कि वह / वह एक फ़ाइल को सहेजना चाहता था, इसलिए उसे खोलने की आवश्यकता है, इसलिए यह समाधान उसके लिए प्रदान करता है।
लेवोन

निर्भर करता है। शायद उसे एक उपयुक्त सर्वर कॉल का निर्माण करने के लिए नाम की आवश्यकता है। निश्चित नहीं। किसी भी दर पर आपका उत्तर निश्चित रूप से अधिक सामान्य मामला है।
लुका

107

आप एक यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए UUID मॉड्यूल का उपयोग कर सकते हैं :

import uuid
filename = str(uuid.uuid4())

यह एक वैध विकल्प है, यह देखते हुए कि एक यूयूआईडी जनरेटर एक नकली पहचानकर्ता (इस मामले में एक फ़ाइल नाम) का उत्पादन करने की संभावना नहीं है:

अगले 100 वर्षों के लिए हर सेकंड 1 बिलियन यूयूआईडी बनाने के बाद, केवल एक डुप्लिकेट बनाने की संभावना लगभग 50% होगी। एक डुप्लिकेट की संभावना लगभग 50% होगी यदि पृथ्वी पर प्रत्येक व्यक्ति 600 मिलियन यूयूआईडी का मालिक है।


17
यह तब भी बहुत उपयोगी है जब आप एक अद्वितीय फ़ाइल नाम चाहते हैं, लेकिन यह अभी तक नहीं बनाया है।
प्रो। फल्केन

15
या uuid.uuid4().hexडैश ( -) के बिना हेक्स स्ट्रिंग प्राप्त करने के लिए उपयोग करें ।
रॉकलेइट

17

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

import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'

4
एक बहु-थ्रेडेड वातावरण में, अनुक्रम में शामिल एक संभावित दौड़ की स्थिति है 1. Test if file exists, 2. create file.यदि कोई अन्य प्रक्रिया आपके चरण 1 और 2 के बीच में बाधा डालती है, और फ़ाइल बनाती है, जब आपका कोड फिर से शुरू होता है तो यह अन्य प्रक्रिया की फ़ाइल को अधिलेखित कर देगा।
ली-आंग येप

@ Li-aungYip इसके अलावा 6-8 रैंडम कैरेक्टर सीक्वेंस का भी इस्तेमाल कर सकते हैं (अगर 2 फाइलें एक ही सेकंड में जेनरेट होती हैं)।
बोब्बोबो

@bobobobo: या आप tempfileमॉड्यूल का उपयोग कर सकते हैं , जो आपके लिए इसे संभालता है। :)
ली-आंग येप

मैं माइक्रोसेकंड यानी जोड़ने के लिए सुझाव देंगे...strftime("%y%m%d_%H%M%S%f")
AstraSerg

8

ओपी यादृच्छिक बनाने के लिए अनुरोध किया फ़ाइल नाम नहीं यादृच्छिक फ़ाइलें । टाइम्स और यूयूआईडी टकरा सकते हैं। यदि आप एक एकल मशीन (एक साझा फाइलसिस्टम नहीं) पर काम कर रहे हैं और आपकी प्रक्रिया / थ्रेड अपने आप ही स्ट्रेप नहीं होगी, तो अपने स्वयं के पीआईडी ​​प्राप्त करने के लिए os.getpid () का उपयोग करें और इसे एक अद्वितीय फ़ाइल नाम के तत्व के रूप में उपयोग करें। अन्य प्रक्रियाओं को स्पष्ट रूप से समान पीआईडी ​​नहीं मिलेगा। यदि आप बहुआयामी हैं, तो थ्रेड आईडी प्राप्त करें। यदि आपके पास अपने कोड के अन्य पहलू हैं, जिसमें एक ही धागा या प्रक्रिया कई अलग-अलग गतिरोध उत्पन्न कर सकती है, तो आपको दूसरी तकनीक का उपयोग करने की आवश्यकता हो सकती है। एक रोलिंग इंडेक्स काम कर सकता है (यदि आप उन्हें इतने लंबे समय तक नहीं रख रहे हैं या कई फ़ाइलों का उपयोग करके आप रोलओवर के बारे में चिंता करेंगे)। वैश्विक हैश / इंडेक्स को "सक्रिय" फाइलों में रखना उस स्थिति में पर्याप्त होगा।

तो लंबे समय तक स्पष्टीकरण के लिए खेद है, लेकिन यह आपके सटीक उपयोग पर निर्भर करता है।


8

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

>>> import random
>>> import string

>>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
>>> file_name
'ytrvmyhkaxlfaugx'

7

यदि आप मूल फ़ाइल नाम को नए फ़ाइल नाम के एक भाग के रूप में संरक्षित करना चाहते हैं, तो मौजूदा समय के MD5 हैश का उपयोग करके समान लंबाई के अनन्य उपसर्ग उत्पन्न किए जा सकते हैं:

from hashlib import md5
from time import localtime

def add_prefix(filename):
    prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
    return f"{prefix}_{filename}"

Add_prefix ('style.css') को कॉल अनुक्रम उत्पन्न करता है:

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css

1
बचने के लिए: यूनिकोड-ऑब्जेक्ट्स को हिंगिंग से पहले एन्कोड किया जाना चाहिए I बदलकर md5 (str (स्थानीय समय))। encode ('utf-8'))। हेक्सडीगैस्ट ()
PhoebeB

1
ध्यान दें कि किसी भी प्रकार के डेटा का एक हैश (टाइमस्टैम्प सहित) अपने आप में विशिष्टता को सुनिश्चित नहीं करता है (किसी भी बेतरतीब ढंग से चुने गए बाइट अनुक्रम से अधिक)।
पीटर ओ।

1

यहाँ मेरे दो सेंट जोड़ना:

In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'

Tempfile.mkstemp के लिए अजगर डॉक्टर के अनुसार, यह सबसे सुरक्षित तरीके से एक अस्थायी फ़ाइल बनाता है। कृपया ध्यान दें कि इस कॉल के बाद फाइल मौजूद रहेगी:

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True

1

मैं व्यक्तिगत रूप से अपने पाठ को न केवल यादृच्छिक / अद्वितीय, बल्कि सुंदर भी पसंद करता हूं, इसीलिए मुझे हैश लिड पसंद है, जो पूर्णांक से अच्छा दिखने वाला यादृच्छिक पाठ उत्पन्न करता है। के माध्यम से स्थापित किया जा सकता है

pip install hashids

स्निपेट:

import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq

संक्षिप्त वर्णन:

हैशिड्स एक छोटा सा ओपन-सोर्स लाइब्रेरी है जो संख्याओं से छोटी, अनोखी, गैर-अनुक्रमिक आईडी बनाता है।


0
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

आप 'string.ascii_letters' को किसी भी स्ट्रिंग प्रारूप में बदल सकते हैं जैसा कि आप किसी भी अन्य पाठ को उत्पन्न करना चाहते हैं, उदाहरण के लिए मोबाइल आईडी; आईडी ... यहां छवि विवरण दर्ज करें


0
import uuid
   imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())

1
हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और शायद अधिक वोट भी मिलेंगे। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
Богдан Опир

-1

आप यादृच्छिक पैकेज का उपयोग कर सकते हैं:

import random
file = random.random()

file = str (random.random ())
aajem

यह रैंडम नंबर जेनरेट कर रहा है, रैंडम टेक्स्ट नहीं।
user1767754
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.