python - যবহ - কিভাবে আমি পাইথনে নিরাপদভাবে একটি ন্যস্ত ডিরেক্টরি তৈরি করতে পারি?




বাংলায় পাইথন (17)

একটি ডিরেক্টরি উপস্থিত কিনা তা পরীক্ষা করে দেখুন এবং প্রয়োজন হলে তা তৈরি করুন?

এর প্রত্যক্ষ উত্তর হল, এমন একটি সাধারণ পরিস্থিতি অনুমান করা যেখানে আপনি অন্যান্য ব্যবহারকারীদের বা প্রসেসগুলি আপনার ডিরেক্টরিটির সাথে মেসেজ করার আশা করেন না:

if not os.path.exists(d):
    os.makedirs(d)

অথবা যদি ডিরেক্টরি তৈরি করা হয় জাতি শর্ত সাপেক্ষে (অর্থাত পথটি পরীক্ষা করার পরে, অন্য কিছু ইতিমধ্যে এটি তৈরি করতে পারে) এটি করুন:

import errno
try:
    os.makedirs(d)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise

কিন্তু সম্ভবত একটি আরও ভাল পদ্ধতি হল tempfile মাধ্যমে অস্থায়ী ডিরেক্টরিগুলি ব্যবহার করে সংস্থার তর্ক সম্পর্কিত সমস্যাটি tempfile :

import tempfile

d = tempfile.mkdtemp()

এখানে অনলাইন ডক থেকে প্রয়োজনীয় বিষয়গুলি রয়েছে:

mkdtemp(suffix='', prefix='tmp', dir=None)
    User-callable function to create and return a unique temporary
    directory.  The return value is the pathname of the directory.

    The directory is readable, writable, and searchable only by the
    creating user.

    Caller is responsible for deleting the directory when done with it.

পাইথন নতুন 3.5: pathlib.Path সঙ্গে exist_ok

একটি নতুন Path বস্তু (3.4 হিসাবে) আছে যার সাথে পাথরগুলি ব্যবহার করতে চান প্রচুর পদ্ধতি - যার মধ্যে একটি mkdir

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

প্রথম প্রাসঙ্গিক আমদানি:

from pathlib import Path
import tempfile

আমরা এখন os.path.join সঙ্গে মোকাবেলা করতে হবে না - শুধু একটি / সঙ্গে পাথ অংশ যোগদান:

directory = Path(tempfile.gettempdir()) / 'sodata'

তারপর আমি exist_ok ডিরেক্টরিটি বিদ্যমান নিশ্চিত করি - পাইথন 3.5 এ বিদ্যমান exist_ok যুক্তি দেখায়:

directory.mkdir(exist_ok=True)

এখানে pathlib.Path.mkdir প্রাসঙ্গিক অংশ:

যদি exist_ok সত্য হয়, তবে FileExistsError ব্যতিক্রমগুলি উপেক্ষা করা হবে ( POSIX mkdir -p কমান্ডের মতো আচরণ), তবে শুধুমাত্র শেষ পাথ উপাদানটি একটি বিদ্যমান অ-ডিরেক্টরি ফাইল নয়।

এখানে স্ক্রিপ্টটি একটু বেশি আছে - আমার ক্ষেত্রে, আমি একটি জাতি শর্ত সাপেক্ষে নই, আমার কাছে কেবল একটি প্রক্রিয়া রয়েছে যা ডিরেক্টরী (বা ফাইল রয়েছে) সেখানে থাকার আশা রাখে, এবং আমার কোনও কিছু সরানোর চেষ্টা করে না ডিরেক্টরি।

todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
    logger.info("todays_file exists: " + str(todays_file))
    df = pd.read_json(str(todays_file))

Path বস্তুগুলিকে অন্য APIs এর আগে str coerced করতে হবে যা str পাথগুলি তাদের ব্যবহার করতে পারে।

সম্ভবত os.PathLike বিমূর্ত বেস ক্লাসের উদাহরণ গ্রহণ করতে আপডেট করা উচিত, os.PathLike

ডিরেক্টরী কোন ফাইলটি বিদ্যমান আছে কিনা তা পরীক্ষা করার সবচেয়ে মার্জিত উপায় কী, এবং যদি না হয় তবে পাইথন ব্যবহার করে ডিরেক্টরি তৈরি করবেন? এখানে আমি চেষ্টা করেছি:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)

একরকম, আমি os.path.exists মিস (ধন্যবাদ Kanja, ব্লেয়ার, এবং ডগলাস)। এই আমি এখন কি আছে:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

"খোলা" জন্য একটি পতাকা আছে, যা এটি স্বয়ংক্রিয়ভাবে ঘটবে?


এই পরিস্থিতির সুনির্দিষ্ট অন্তর্দৃষ্টি

আপনি একটি নির্দিষ্ট পথ একটি নির্দিষ্ট ফাইল দিতে এবং আপনি ফাইল পাথ থেকে ডিরেক্টরি টান। তারপরে আপনার ডিরেক্টরির টি নিশ্চিত করার পরে, আপনি পড়ার জন্য একটি ফাইল খুলতে চেষ্টা করেন। এই কোড মন্তব্য করতে:

filename = "/my/directory/filename.txt"
dir = os.path.dirname(filename)

আমরা বিল্টিন ফাংশন overwriting এড়াতে চাই, dir । এছাড়াও, fullfilepath বা সম্ভবত পূর্ণ fullfilepath সম্ভবত filename নামের চেয়ে আরও ভাল fullfilepath filename তাই এটি আরও ভাল লেখা হবে:

import os
filepath = '/my/directory/filename.txt'
directory = os.path.dirname(filepath)

আপনার শেষ লক্ষ্যটি এই ফাইলটি খুলতে হয়, আপনি প্রাথমিকভাবে লেখার জন্য বলে থাকেন তবে আপনি মূলত এই লক্ষ্যটি (আপনার কোডের উপর ভিত্তি করে) এগিয়ে আসছেন, যা পড়ার জন্য ফাইলটি খোলে:

if not os.path.exists(directory):
    os.makedirs(directory)
f = file(filename)

পড়ার জন্য খোলার অনুমান

এমন একটি ফাইলের জন্য আপনি কেন এমন একটি ডিরেক্টরি তৈরি করবেন যা আপনি সেখানে থাকতে এবং পড়তে সক্ষম হবেন?

শুধু ফাইল খুলতে চেষ্টা করুন।

with open(filepath) as my_file:
    do_stuff(my_file)

যদি ডিরেক্টরী বা ফাইল নেই, তবে সংশ্লিষ্ট ত্রুটি সংখ্যার সাথে একটি errno.ENOENT পাবেন: errno.ENOENT আপনার প্ল্যাটফর্ম নির্বিশেষে সঠিক ত্রুটির নম্বর নির্দেশ করবে। আপনি যদি চান তবে এটি ধরতে পারেন, উদাহরণস্বরূপ:

import errno
try:
    with open(filepath) as my_file:
        do_stuff(my_file)
except IOError as error:
    if error.errno == errno.ENOENT:
        print 'ignoring error because directory or file is not there'
    else:
        raise

আমরা লেখার জন্য খোলার করছি অনুমান

এটি সম্ভবত আপনি কি চান।

এই ক্ষেত্রে, আমরা সম্ভবত কোনো জাতি অবস্থার সম্মুখীন হয় না। তাই আপনি শুধু হিসাবে ছিল, কিন্তু মনে রাখবেন যে লেখার জন্য, আপনি w মোড (অথবা a যোগ করার জন্য) সঙ্গে খুলতে হবে। ফাইলগুলি খোলার জন্য প্রসঙ্গ পরিচালক ব্যবহার করার জন্য এটি একটি পাইথন সর্বোত্তম অনুশীলন।

import os
if not os.path.exists(directory):
    os.makedirs(directory)
with open(filepath, 'w') as my_file:
    do_stuff(my_file)

যাইহোক, আমাদের বেশ কয়েকটি পাইথন প্রক্রিয়া রয়েছে যা তাদের সমস্ত তথ্য একই ডিরেক্টরিতে রাখতে চেষ্টা করে। তারপরে আমাদের ডিরেক্টরির তৈরির উপর বিরোধ থাকতে পারে। সেই ক্ষেত্রে ব্লক বাদে makedirs কলটি মোড়ানো চেষ্টা করা ভাল।

import os
import errno
if not os.path.exists(directory):
    try:
        os.makedirs(directory)
    except OSError as error:
        if error.errno != errno.EEXIST:
            raise
with open(filepath, 'w') as my_file:
    do_stuff(my_file)

আপনি mkpath ব্যবহার করতে পারেন

# Create a directory and any missing ancestor directories. 
# If the directory already exists, do nothing.

from distutils.dir_util import mkpath
mkpath("test")    

মনে রাখবেন এটি পূর্বপুরুষ ডিরেক্টরিগুলিও তৈরি করবে।

এটি পাইথন 2 এবং 3 এর জন্য কাজ করে।


আমি os.path.exists() ব্যবহার করি, here একটি পাইথন 3 স্ক্রিপ্ট রয়েছে যা একটি ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে, যদি এটি বিদ্যমান না হয় তবে এটি তৈরি করুন এবং যদি এটি বিদ্যমান থাকে তবে এটি মুছুন।

এটি নির্দেশিকার জন্য ব্যবহারকারীদের অনুরোধ জানায় এবং সহজেই সংশোধন করা যেতে পারে।


আমি নীচের করা আছে। এটা সম্পূর্ণ নির্বোধ যদিও না।

import os

dirname = 'create/me'

try:
    os.makedirs(dirname)
except OSError:
    if os.path.exists(dirname):
        # We are nearly safe
        pass
    else:
        # There was an error on creation, so make sure we know about it
        raise

এখন আমি বলি, এটি সত্যিই বোকা বানানো নয় কারণ আমাদের ডিরেক্টরি তৈরি করতে ব্যর্থ হওয়ার সম্ভাবনার সম্ভাবনা আছে এবং সেই সময়ের মধ্যে আরেকটি প্রক্রিয়া তৈরি হচ্ছে।


আমি ভালো গুণাবলীর সাথে দুটি উত্তর দেখতে পাচ্ছি, প্রতিটিটি একটি ক্ষুদ্র ত্রুটি নিয়ে, তাই আমি এটি গ্রহণ করবো:

os.path.exists চেষ্টা করুন, এবং সৃষ্টির জন্য os.makedirs বিবেচনা।

import os
if not os.path.exists(directory):
    os.makedirs(directory)

মতামত ও অন্য কোথাও উল্লেখ করা হয়েছে, একটি জাতি শর্ত আছে - যদি ডিরেক্টরি os.path.exists এবং os.path.exists মধ্যে তৈরি করা হয়, তবে os.makedirs একটি OSError সাথে ব্যর্থ হবে। দুর্ভাগ্যবশত, কম্বল-আকৃষ্ট OSError এবং অবিরত করা OSError নয়, কারণ এটি অন্যান্য কারণগুলির কারণে ডিরেক্টরি তৈরি করতে ব্যর্থতার অবহেলা করবে যেমন অপর্যাপ্ত অনুমতি, সম্পূর্ণ ডিস্ক ইত্যাদি।

এক বিকল্প OSError আটকে এবং এমবেডেড ত্রুটি কোড পরীক্ষা করা হবে ( পাইথনের OSError থেকে তথ্য পাওয়ার একটি ক্রস প্ল্যাটফর্ম উপায় দেখুন ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

বিকল্পভাবে, দ্বিতীয় os.path.exists হতে পারে, তবে অন্যটি প্রথম চেকের পরে ডিরেক্টরিটি তৈরি করে তবে দ্বিতীয়টি এর আগে এটি সরানো হয়েছে - আমরা এখনও বোকা বানাতে পারি।

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


ত্রুটি-বিচ্যুতির মডিউল ব্যতীত চেষ্টা এবং সঠিক ত্রুটির কোডটি রেস অবস্থায় থেকে পরিত্রাণ পায় এবং ক্রস-প্ল্যাটফর্ম হয়:

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

অন্য কথায়, আমরা ডিরেক্টরি তৈরি করার চেষ্টা করি, কিন্তু যদি তারা ইতিমধ্যে বিদ্যমান থাকে তবে আমরা ভুল উপেক্ষা করি। অন্যদিকে, অন্য কোন ত্রুটি রিপোর্ট পায়। উদাহরণস্বরূপ, যদি আপনি পূর্বে ' OSError ' তৈরি করেন এবং এর থেকে সমস্ত অনুমতিগুলি সরিয়ে ফেলেন, তবে আপনাকে একটি OSError হবে। errno.EACCES (অনুমতি অস্বীকার, ত্রুটি 13)।


পাইথন 3.4 এ আপনি ব্র্যান্ড নতুন pathlib মডিউল ব্যবহার করতে পারেন:

from pathlib import Path
path = Path("/my/directory/filename.txt")
try:
    if not path.parent.exists():
        path.parent.mkdir(parents=True)
except OSError:
    # handle error; you can also catch specific errors like
    # FileExistsError and so on.

প্রাসঙ্গিক পাইথন ডকুমেন্টেশন EAFP কোডিং শৈলী (অনুমতি চেয়ে ক্ষমা চাইতে সহজতর) ব্যবহার প্রস্তাব করে। এই কোড যে মানে

try:
    os.makedirs(path)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise
    else:
        print "\nBE CAREFUL! Directory %s already exists." % path

বিকল্প চেয়ে ভাল

if not os.path.exists(path):
    os.makedirs(path)
else:
    print "\nBE CAREFUL! Directory %s already exists." % path

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

এমনকি যে ক্ষেত্রে, এটি একটি খারাপ অভ্যাস এবং দীর্ঘ নিরর্থক ডিবাগিং হতে পারে। উদাহরণস্বরূপ, আমরা যে কোনও ডিরেক্টরিের জন্য অনুমতিগুলি সেট করি তা আমাদেরকে ছাপানো অনুমতিগুলির সাথে আমাদের উদ্দেশ্যগুলির জন্য উপযুক্তভাবে সেট করা উচিত নয়। একটি প্যারেন্ট ডিরেক্টরি অন্যান্য অনুমতি দিয়ে মাউন্ট করা যেতে পারে। সাধারণত, একটি প্রোগ্রাম সবসময় সঠিকভাবে কাজ করা উচিত এবং প্রোগ্রামার একটি নির্দিষ্ট পরিবেশ আশা করা উচিত নয়।


os.path.exists ফাংশন চেষ্টা করুন

if not os.path.exists(dir):
    os.mkdir(dir)

os.path.isdir() পরিবর্তে পরীক্ষা করার জন্য আপনি os.path.isdir() ব্যবহার করে ব্যক্তিগতভাবে সুপারিশ করবেন।

>>> os.path.exists('/tmp/dirname')
True
>>> os.path.exists('/tmp/dirname/filename.etc')
True
>>> os.path.isdir('/tmp/dirname/filename.etc')
False
>>> os.path.isdir('/tmp/fakedirname')
False

যদি তোমার থাকে:

>>> dir = raw_input(":: ")

এবং একটি নির্বোধ ব্যবহারকারী ইনপুট:

:: /tmp/dirname/filename.etc

আপনি os.makedirs() সাথে পরীক্ষা করলে os.makedirs() যে যুক্তিটি পাস করেন তা আপনি filename.etc নামে একটি ডিরেক্টরি দিয়ে শেষ করতে যাচ্ছেন।


Python3 তে , os.makedirs বিদ্যমান os.makedirs সেটিংটি সমর্থন করে। ডিফল্ট সেটিংটি False , যার অর্থ লক্ষ্য ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে একটি OSError উত্থাপিত হবে। True exist_ok নির্ধারণ করে, OSError (ডিরেক্টরি বিদ্যমান) উপেক্ষা করা হবে এবং ডিরেক্টরিটি তৈরি করা হবে না।

os.makedirs(path,exist_ok=True)

os.makedirs , os.makedirs exist_ok সেটিংটি সমর্থন করে না। আপনি হিকিকি-টিভোয়েনের উত্তরের পদ্ধতিটি ব্যবহার করতে পারেন:

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

এই কমান্ড ব্যবহার করে পরীক্ষা করুন এবং ডির তৈরি করুন

 if not os.path.isdir(test_img_dir):
     os.mkdir(str("./"+test_img_dir))

ফাইল I / O দিয়ে কাজ করার সময়, গুরুত্বপূর্ণ বিষয় বিবেচনা করা হয়

TOCTTOU (ব্যবহারের সময় চেক করার সময়)

সুতরাং একটি চেক করছেন ifএবং তারপরে পড়া বা লেখার পরে একটি unhandled I / O ব্যতিক্রমের মধ্যে শেষ হতে পারে। এটি করার সেরা উপায় হল:

try:
    os.makedirs(dir_path)
except OSError as e:
    if e.errno != errno.EEXIS:
        raise

আপনি os.listdirএই জন্য ব্যবহার করতে পারেন :

import os
if 'dirName' in os.listdir('parentFolderPath')
    print('Directory Exists')

আমি হিকিকি টোভোয়েন এবং share এর উত্তর দেখেছি এবং এই বৈচিত্রের কথা চিন্তা করেছি।

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST or not os.path.isdir(path):
            raise

import os
if os.path.isfile(filename):
    print "file exists"
else:
    "Your code here"

যেখানে আপনার কোড এখানে (স্পর্শ) কমান্ড ব্যবহার করা হয়

এটি যদি এটি না থাকে তবে এটি ফাইল তৈরি করবে কিনা তা পরীক্ষা করবে।





operating-system