পাইথনে এলোমেলো ফাইলের নাম উত্পন্ন করার সেরা উপায়


99

পাইথনে, কোনও সার্ভারে সংরক্ষণ করা কোনও ফাইল (নাম) প্রিপেন্ড করার জন্য কিছু র্যান্ডম পাঠ্য উত্সর্গ করার সর্বোত্তম উপায় বা কেবল এটির ওভাররাইট না ঘটে তা নিশ্চিত করার জন্য way ধন্যবাদ!

উত্তর:


111

পাইথনের অস্থায়ী ফাইলের নাম উত্পন্ন করার সুবিধা রয়েছে, দেখুন 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'

অস্থায়ী ফাইলগুলির সাথে কাজ করার জন্য অতিরিক্ত উদাহরণগুলি এখানে পাওয়া যাবে


4
আমি যখন আবার আমার মেশিনটি পুনরায় চালু করব তখন কি সেই ফাইলগুলি মুছে ফেলা হবে?
স্মৃতিচেস

16
এই সমাধানটির সমস্যাটি হ'ল এটি কেবল একটি ফাইলের নামই নয়, ইতিমধ্যে খোলা একটি ফাইলও উত্পন্ন করে। আপনার যদি কোনও নতুন, এখনও বিদ্যমান ফাইলের জন্য অস্থায়ী ফাইলের নাম প্রয়োজন হয় (যেমন, একটি ওএস কমান্ডের আউটপুট হিসাবে ব্যবহার করার জন্য), এটি করবে না। সেক্ষেত্রে আপনি str (uuid.uuid4 ()) এর মতো কিছু করতে পারেন।
লুকা

@ লুকা অতিরিক্ত মন্তব্যের জন্য ধন্যবাদ, এটি কার্যকর এবং ভবিষ্যতের রেফারেন্সের জন্য উল্লেখ করা হয়েছে। যাইহোক, ওপি স্পষ্টভাবে জানিয়েছে যে সে / সে কোনও ফাইল সংরক্ষণ করতে চেয়েছিল, তাই এটি খুলতে হবে, সুতরাং এই সমাধানটির জন্য এটি সরবরাহ করে।
লেভন

এটা নির্ভর করে. একটি উপযুক্ত সার্ভার কল নির্মাণের জন্য সম্ভবত তাঁর নামটির প্রয়োজন। নিশ্চিত না. যে কোনও হারে আপনার উত্তর অবশ্যই আরও সাধারণ ক্ষেত্রে।
লুকা

113

আপনি এলোমেলো স্ট্রিং তৈরির জন্য ইউআইডি মডিউলটি ব্যবহার করতে পারেন :

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

এটি একটি বৈধ পছন্দ, প্রদত্ত যে কোনও ইউইউডি জেনারেটরের নকল শনাক্তকরণ (একটি ফাইলের নাম, এই ক্ষেত্রে) উত্পাদন করার সম্ভাবনা খুব কম:

পরের 100 বছরের জন্য প্রতি সেকেন্ডে 1 বিলিয়ন ইউইউডি উত্পন্ন করার পরে, কেবলমাত্র একটি নকল তৈরির সম্ভাবনা প্রায় 50% হবে। পৃথিবীর প্রতিটি ব্যক্তি 600০০ মিলিয়ন ইউইউডির মালিক হলে একটি সদৃশ হওয়ার সম্ভাবনা প্রায় 50% হবে।


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 পদক্ষেপের মধ্যে বাধা দেয় এবং ফাইলটি তৈরি করে, যখন আপনার কোডটি পুনরায় শুরু হবে এটি অন্যান্য প্রক্রিয়া ফাইলটি ওভাররাইট করে দেবে।
লি-অং ইপ

@ লি-অংওয়াইপ এছাড়াও 6-8 র্যান্ডম চরিত্রের ক্রম ব্যবহার করতে পারে (যদি 2 টি ফাইল একই দ্বিতীয় ক্ষেত্রে উত্পন্ন হয়)।
বোবোবোবো

@ বোবোবো: বা আপনি tempfileমডিউলটি ব্যবহার করতে পারেন যা এটি আপনার জন্য পরিচালনা করে। :)
লি-অং ইপ

আমি মাইক্রোসেকেন্ডগুলি যুক্ত করার পরামর্শ দিই...strftime("%y%m%d_%H%M%S%f")
এস্ট্রা সার্গ

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}"

অ্যাড_প্রিফিক্স ('স্টাইল। সিএসএস') এ কলগুলি এর মতো ক্রম উত্পন্ন করে:

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css

4
এড়াতে: ইউনিকোড-অবজেক্টগুলি হ্যাশ করার আগে অবশ্যই এমডোড করতে হবে এমডি 5 (স্ট্রিং (লোকালটাইম ())। এনকোড ('ইউটিফ -8'))। হেক্সডিজস্ট ()
ফোবিবি

4
মনে রাখবেন যে কোনও ধরণের ডেটা (একটি টাইমস্ট্যাম্প সহ) একটি হ্যাশ নিজেই স্বতন্ত্রতা নিশ্চিত করে না (এলোমেলোভাবে নির্বাচিত বাইট সিকোয়েন্সের চেয়ে আরও কিছু)।
পিটার ও।

1

আমার দুটি সেন্ট এখানে যুক্ত করা হচ্ছে:

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

টেম্পিল ফাইলের জন্য অজগর ডক অনুসারে .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'

আপনি যেকোন স্ট্রিং ফর্ম্যাটে 'স্ট্রিং.এএসসিআইলেট্রেস' পরিবর্তন করতে পারেন আপনি যেমন অন্য কোনও পাঠ্য উত্পন্ন করতে চান, উদাহরণস্বরূপ মোবাইল নম্বর, আইডি ... এখানে চিত্র বর্ণনা লিখুন


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

4
এই কোডটি কীভাবে এবং কেন সমস্যার সমাধান করে তার ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে যদিও আপনার পোস্টের মান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলাফল হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখন যে ব্যক্তি জিজ্ঞাসা করছেন তা নয়। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করতে পারেন এবং সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ একটি ইঙ্গিত দিতে আপনার উত্তর।
Опир

-1

আপনি এলোমেলো প্যাকেজটি ব্যবহার করতে পারেন:

import random
file = random.random()

file = str (random.random ())
anajem

এটি এলোমেলো সংখ্যা উত্পন্ন করছে, এলোমেলো পাঠ্য নয়।
ব্যবহারকারী 1767754
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.