পাইথন: একটি অনন্য ফাইলের নাম কীভাবে তৈরি করবেন?


95

আমার কাছে দুটি অপশন সহ পাইথন ওয়েব ফর্ম রয়েছে - ফাইল আপলোড এবং টেক্সারিয়া । আমার প্রত্যেকের কাছ থেকে মানগুলি নেওয়া এবং সেগুলি অন্য কমান্ড-লাইন প্রোগ্রামে স্থান দেওয়া দরকার। আমি ফাইল আপলোড অপশনের সাহায্যে ফাইলের নামটি সহজেই পাস করতে পারি, তবে কীভাবে টেক্সারিয়ার মানটি পাস করতে হবে তা সম্পর্কে আমি নিশ্চিত নই।

আমার মনে হয় আমার যা করা দরকার তা হ'ল:

  1. একটি অনন্য ফাইলের নাম উত্পন্ন করুন
  2. কার্যকারী ডিরেক্টরিতে সেই নামটি দিয়ে একটি অস্থায়ী ফাইল তৈরি করুন
  3. টেক্সারিয়া থেকে পাস করা মানগুলি অস্থায়ী ফাইলে সংরক্ষণ করুন
  4. আমার অজগর মডিউলটির ভিতরে থেকে কমান্ডলাইন প্রোগ্রামটি কার্যকর করুন এবং এটি অস্থায়ী ফাইলটির নাম দিন

আমি জানি না কীভাবে একটি অনন্য ফাইলের নাম উত্পন্ন করা যায়। কেউ কীভাবে আমাকে একটি অনন্য ফাইলের নাম উত্পাদন করতে পারে তার জন্য কিছু টিপস দিতে পারেন? যে কোনও অ্যালগরিদম, পরামর্শ এবং কোডের লাইনগুলি প্রশংসা করা হয়।

আপনার উদ্বেগ - এর জন্য ধন্যবাদ


4
আমি আপনার প্রশ্নটি আরও স্পষ্ট করে চেষ্টা করার জন্য সম্পাদনা করেছি। আমি যদি কিছু ভুল ব্যাখ্যা করি তবে আমাকে জানান!
কালিক্স

উত্তর:


147

আমি মনে করি না যে আপনার প্রশ্নটি খুব পরিষ্কার ছিল, তবে আপনার যদি প্রয়োজন হয় তবে একটি অনন্য ফাইলের নাম ...

import uuid

unique_filename = str(uuid.uuid4())

দুঃখিত আমি উইন্ডোজ প্ল্যাটফর্মে কাজ করছি তাই কীভাবে সাবপ্রসেস পরিচালনা করতে হবে তা জানেন না
মাইস্টিকোডস

uuid মনে হয় একটি দীর্ঘ অনন্য স্ট্রিং তৈরি করেছে। এতে লম্বা স্ট্রিং এবং ইউআইডি, () সহ ফাইলের নাম থাকা ভাল বলে আমি মনে করি না।
মাইস্টিকোডস

6
আমার মনে হয় uuid.uuid4().hexআরও ভাল পছন্দ হবে, এখানে বিস্তারিত দেখুন ।
গ্রে লি

4
@ টোলোপালমার: এটি সম্ভবত আপনার কম্পিউটারের সিপিইউতে একটি প্রসেসিং ত্রুটি রয়েছে যার কারণে এটি কোনও উত্পন্ন ইউইউডি যে কোনও বিদ্যমান মানের সাথে সংঘর্ষের চেয়ে ভুল ফাইলটি লোড করে। ইউইউডিউ কম্পিউটিংয়ের মডেলটিতে একটি অনন্য নাম তৈরি করে যা সমস্ত গণনা শুদ্ধ গণিত বোঝে না।
GManNickG

4
আমার অজ্ঞতার পুরানো মন্তব্যকে ক্ষমা করুন ... সত্যিই অনন্য নয় তবে সংঘর্ষের খুব কম সম্ভাবনা, তাই ভাল পছন্দ;)
টলো পামার

51

আপনি যদি পাইথনে অস্থায়ী ফাইল তৈরি করতে চান তবে পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে টেম্পাইল নামে একটি মডিউল রয়েছে । আপনি যদি ফাইলটিতে অপারেট করার জন্য অন্যান্য প্রোগ্রাম চালু করতে চান তবে ফাইল তৈরি করতে টেম্পাইল.ম্যাক্সটেম্প () ব্যবহার করুন এবং 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 () নিজেকে ফেরৎ অস্থায়ী ফাইল মুছে ফেলতে!

(সম্পাদনা: আমি ধরে নিয়েছিলাম যে নেমডেম্পের্পিয়ার ফাইলটি আপনার পরে যা করেছেন ঠিক তেমনটি করেছেন তবে এটি এতটা সুবিধাজনক নাও হতে পারে - টেম্প ফাইলের অবজেক্টটি বন্ধ হয়ে যাওয়ার সাথে সাথে ফাইলটি মুছে ফেলা হবে এবং ফাইলটি বন্ধ করার আগে অন্যান্য প্রক্রিয়াগুলি ফাইলটি খুলবে) কিছু প্ল্যাটফর্মে, বিশেষত উইন্ডোজ কাজ করবে না। দুঃখিত, আমার পক্ষ থেকে ব্যর্থ।)


নেমডেম্পের্পিয়ারফিল ব্যবহার করা সম্ভবত তারা যা চায় তা (তারা না চাইলে এটি সার্ভারে থাকতে পারে, এবং তারপরে তারা "টেম্পাইল। নামডেম্পের্পিয়ারফিল (মুছুন = মিথ্যা)" ব্যবহার করতে পারে)
টেরেন্স হোলস

আমি কি সেই অস্থায়ী ফাইলটির নামটিকেও অনন্য করতে পারি? তাই আমি পরে এটি সংরক্ষণ করতে পারি যখন সাবপ্রসেসটি অনন্য নাম দিয়ে শেষ হয়
মাইস্টিক কোডস

@ টেরেন্স হোলস: আমি প্রাথমিকভাবে টেম্পাইলের প্রস্তাব দিয়েছিলাম N নামডেম্পোরারি ফাইলে () মূলত, তবে উইন্ডোজে অন্যান্য প্রক্রিয়া অ্যাক্সেস করতে পারে এমন অস্থায়ী ফাইলগুলি তৈরি করতে আপনি এটি ব্যবহার করতে পারবেন না। নামযুক্ত টেম্পোরারিফাইল (মুছুন = মিথ্যা) অবশ্যই ক্লিনার । @ ব্যবহারকারী 343934: tempfile.mkstemp () প্রতিবার যখন ডাকা হয় তখন আপনাকে একটি অনন্য নাম দেওয়ার গ্যারান্টি দেওয়া হয় - এটি নামগুলি এলোমেলোভাবে উত্পন্ন করে এবং সংঘর্ষ এড়াতে এটি ওএস সুবিধা (ও_এক্সসিএল, যদি আপনি ভাবছেন) ব্যবহার করে।
রিচার্ড ব্যারেল

বাহ আমি জানতাম না এটি উইন্ডোতে কাজ করে না ... ব্যর্থ :( ... আমি অনুমান করি এটি জেনে রাখা ভাল
টেরেন্স হোলস

@ টেরেন্স হোনলস: নামযুক্ত টেম্পোরারি ফাইল () আসলে উইন্ডোজে ব্যর্থ হয় না (যতদূর আমি জানি), তবে আপনি ফাইলটিও মোছা না করে বন্ধ করতে পারবেন না, এবং (উইন্ডোতে ফাইল শব্দার্থিক বুঝতে পেরেছি) অন্য কোনও প্রোগ্রাম খুলতে পারে না আপনার যখন এটি খুলবে তখন ফাইল করুন। আমার ভুলও হতে পারে; উইন্ডোজের অধীনে কোনও ফাইল ভাগ করার জন্য একাধিক প্রক্রিয়া করার জন্য শব্দার্থবিজ্ঞানের পরিবর্তন হতে পারে কারণ আমি শেষবার যাচাই করেছি checked
রিচার্ড ব্যারেল

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

4
ড্যাশ হওয়ার সমস্যা কী?
ডেভিড লোপেজ

15

আপনার অনন্য অস্থায়ী ফাইলের প্রয়োজন হতে পারে?

import tempfile

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

print f.name
f.close()

f ফাইল খোলা আছে। delete=Falseমানে বন্ধ হওয়ার পরে ফাইলটি মুছবেন না।

আপনার যদি ফাইলটির নামের উপর নিয়ন্ত্রণের প্রয়োজন হয় তবে এমন optionচ্ছিক prefix=...এবং suffix=...যুক্তি রয়েছে যা স্ট্রিং নেয়। Https://docs.python.org/3/library/tempfile.html দেখুন ।


আপনার যদি ফাইলটির নাম নিয়ন্ত্রণ করার প্রয়োজন না হয় তবে এটি দুর্দান্ত।
হাইওয়েলন

4
এটি টেম্পাইল করা উচিত amed নামডেম্পের্পিয়ার ফাইলটি কেবল নামডেম্পোরারি ফাইলই নয়।
ব্যবহারকারী 1993015

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যেহেতু অনেক অপারেটিং সিস্টেমে ফাইলনামগুলিতে কলোনগুলির অনুমতি নেই।

এটাই, এটি আপনাকে প্রতি একক সময় একটি অনন্য ফাইলের নাম দেবে।


4
একে অপরের পরের সাথে সাথে ফাইলের নাম তৈরি না করা (উদাহরণস্বরূপ লুপে)। তারপরে তারা একই রকম।
skjerns

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)

4
প্রশ্নের সুস্পষ্ট উত্তরটি uuid প্যাকেজটির সাথে করা উচিত। তবে আমার টার্গেট সার্ভারটির পাইথন ২.৪ রয়েছে, কোনও লিউজ প্যাকেজ নেই এবং আপগ্রেড করা উত্তরাধিকারসূত্রে সফ্টওয়্যার অসম্পূর্ণতার কারণে সার্ভারের মালিক কর্তৃক অনুমোদিত হয়নি, সুতরাং এই উত্তরটি আমার পক্ষে কাজ করে।
আলবার্তো গাওনা

4
আমি বিশেষত এই উত্তরটি পছন্দ করি: সহজেই প্রকল্পের চশমাগুলিতে টুইট করা যায় can
সোদেব

4
1) এখানে পুনরাবৃত্তি ব্যবহার করার কোনও কারণ নেই, বিশেষত সীমাহীন। 2) path.exists()ফিরে Falseআসার সময় এবং কোনও গ্রাহক আসলে ফাইলটি খোলার সময়ের মধ্যে রেসের শর্ত থাকে ।
জোনাথন রাইনহার্ট

1

এটি ufp.path মডিউলটিতে অনন্য ফাংশন ব্যবহার করে করা যেতে পারে ।

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

যদি বর্তমান পথটি 'test.ext' ফাইল উপস্থিত থাকে। ufp.path.unique ফাংশন রিটার্ন './test (d1) .xt'।


6
ইউএফপি ড্রুপালের অংশ? মানক মডিউল নয়
এন্ডোলিথ

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, শর্টইউইড ছোট হাতের অক্ষর এবং বড় হাতের অক্ষর এবং অঙ্কগুলি ব্যবহার করে এবং 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'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.