पायथन में, एक फ़ाइल (नाम) को प्रस्तुत करने के लिए कुछ यादृच्छिक पाठ उत्पन्न करने के लिए एक अच्छा, या सबसे अच्छा तरीका क्या है जो मैं एक सर्वर पर सहेज रहा हूं, बस यह सुनिश्चित करने के लिए कि यह ओवरराइट नहीं करता है। धन्यवाद!
जवाबों:
पायथन में अस्थायी फ़ाइल नाम जनरेट करने की सुविधा है, 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'
अस्थायी फ़ाइलों के साथ काम करने के लिए अतिरिक्त उदाहरण यहां देखे जा सकते हैं
आप एक यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए UUID मॉड्यूल का उपयोग कर सकते हैं :
import uuid
filename = str(uuid.uuid4())
यह एक वैध विकल्प है, यह देखते हुए कि एक यूयूआईडी जनरेटर एक नकली पहचानकर्ता (इस मामले में एक फ़ाइल नाम) का उत्पादन करने की संभावना नहीं है:
अगले 100 वर्षों के लिए हर सेकंड 1 बिलियन यूयूआईडी बनाने के बाद, केवल एक डुप्लिकेट बनाने की संभावना लगभग 50% होगी। एक डुप्लिकेट की संभावना लगभग 50% होगी यदि पृथ्वी पर प्रत्येक व्यक्ति 600 मिलियन यूयूआईडी का मालिक है।
uuid.uuid4().hex
डैश ( -
) के बिना हेक्स स्ट्रिंग प्राप्त करने के लिए उपयोग करें ।
फ़ाइल के लिए कुछ अस्थायी संबंध रखने के लिए फ़ाइल नाम के लिए उपसर्ग / प्रत्यय के रूप में टाइमस्टैम्प जोड़ना एक सामान्य दृष्टिकोण है। यदि आपको अधिक विशिष्टता की आवश्यकता है तो आप अभी भी इसमें एक यादृच्छिक स्ट्रिंग जोड़ सकते हैं।
import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
1. Test if file exists, 2. create file.
यदि कोई अन्य प्रक्रिया आपके चरण 1 और 2 के बीच में बाधा डालती है, और फ़ाइल बनाती है, जब आपका कोड फिर से शुरू होता है तो यह अन्य प्रक्रिया की फ़ाइल को अधिलेखित कर देगा।
tempfile
मॉड्यूल का उपयोग कर सकते हैं , जो आपके लिए इसे संभालता है। :)
...strftime("%y%m%d_%H%M%S%f")
ओपी यादृच्छिक बनाने के लिए अनुरोध किया फ़ाइल नाम नहीं यादृच्छिक फ़ाइलें । टाइम्स और यूयूआईडी टकरा सकते हैं। यदि आप एक एकल मशीन (एक साझा फाइलसिस्टम नहीं) पर काम कर रहे हैं और आपकी प्रक्रिया / थ्रेड अपने आप ही स्ट्रेप नहीं होगी, तो अपने स्वयं के पीआईडी प्राप्त करने के लिए os.getpid () का उपयोग करें और इसे एक अद्वितीय फ़ाइल नाम के तत्व के रूप में उपयोग करें। अन्य प्रक्रियाओं को स्पष्ट रूप से समान पीआईडी नहीं मिलेगा। यदि आप बहुआयामी हैं, तो थ्रेड आईडी प्राप्त करें। यदि आपके पास अपने कोड के अन्य पहलू हैं, जिसमें एक ही धागा या प्रक्रिया कई अलग-अलग गतिरोध उत्पन्न कर सकती है, तो आपको दूसरी तकनीक का उपयोग करने की आवश्यकता हो सकती है। एक रोलिंग इंडेक्स काम कर सकता है (यदि आप उन्हें इतने लंबे समय तक नहीं रख रहे हैं या कई फ़ाइलों का उपयोग करके आप रोलओवर के बारे में चिंता करेंगे)। वैश्विक हैश / इंडेक्स को "सक्रिय" फाइलों में रखना उस स्थिति में पर्याप्त होगा।
तो लंबे समय तक स्पष्टीकरण के लिए खेद है, लेकिन यह आपके सटीक उपयोग पर निर्भर करता है।
यदि आपको कोई फ़ाइल पथ की आवश्यकता नहीं है, लेकिन केवल यादृच्छिक स्ट्रिंग जिसमें पूर्वनिर्धारित लंबाई है, तो आप इस तरह से कुछ का उपयोग कर सकते हैं।
>>> import random
>>> import string
>>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
>>> file_name
'ytrvmyhkaxlfaugx'
यदि आप मूल फ़ाइल नाम को नए फ़ाइल नाम के एक भाग के रूप में संरक्षित करना चाहते हैं, तो मौजूदा समय के 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
यहाँ मेरे दो सेंट जोड़ना:
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
मैं व्यक्तिगत रूप से अपने पाठ को न केवल यादृच्छिक / अद्वितीय, बल्कि सुंदर भी पसंद करता हूं, इसीलिए मुझे हैश लिड पसंद है, जो पूर्णांक से अच्छा दिखने वाला यादृच्छिक पाठ उत्पन्न करता है। के माध्यम से स्थापित किया जा सकता है
pip install hashids
स्निपेट:
import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq
संक्षिप्त वर्णन:
हैशिड्स एक छोटा सा ओपन-सोर्स लाइब्रेरी है जो संख्याओं से छोटी, अनोखी, गैर-अनुक्रमिक आईडी बनाता है।
>>> import random
>>> import string
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'
आप 'string.ascii_letters' को किसी भी स्ट्रिंग प्रारूप में बदल सकते हैं जैसा कि आप किसी भी अन्य पाठ को उत्पन्न करना चाहते हैं, उदाहरण के लिए मोबाइल आईडी; आईडी ...
import uuid
imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
आप यादृच्छिक पैकेज का उपयोग कर सकते हैं:
import random
file = random.random()