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




exception path (20)

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

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

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)

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


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

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

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

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

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

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)।


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

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

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

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

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


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

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

পাইথন 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.

পাইথন 3.5+:

import pathlib
pathlib.Path('/my/directory').mkdir(parents=True, exist_ok=True) 

pathlib.Path.mkdir উপরে ব্যবহৃত হিসাবে ডিরেক্টরি তৈরি করে এবং ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে একটি ব্যতিক্রম বাড়াতে না। পিতামাতার তৈরি করতে বা চান না, তাহলে parents যুক্তি উপেক্ষা করুন।

পাইথন 3.2+:

pathlib ব্যবহার করে:

যদি আপনি করতে পারেন, pathlib নামে বর্তমান pathlib ব্যাকপোর্ট ইনস্টল করুন। pathlib নামে পুরোনো pathlib ব্যাকপোর্ট ইনস্টল করবেন না। এরপরে, উপরে পাইথন 3.5+ সেকশন পড়ুন এবং এটি একই ব্যবহার করুন।

Python 3.4 ব্যবহার করা হলেও, এটি pathlib সাথে আসে, তবে এটি pathlib exist_ok বিকল্পটি অনুপস্থিত। ব্যাকপোর্টটি এমকিডিআইআর এর একটি নতুন এবং উচ্চতর বাস্তবায়ন অফার করার উদ্দেশ্যে যা এই অনুপস্থিত বিকল্পটি অন্তর্ভুক্ত করে।

os ব্যবহার করে:

import os
os.makedirs(path, exist_ok=True)

os.makedirs পুনরাবৃত্তির উপরে ব্যবহৃত হিসাবে ডিরেক্টরি তৈরি করে এবং ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে একটি ব্যতিক্রম বাড়াতে না। এটি কেবলমাত্র exist_ok 3.2+ ব্যবহার করে বৈকল্পিক exist_ok আর্গুমেন্ট থাকলে, ডিফল্ট মান False । এই যুক্তিটি পাইথন 2.x পর্যন্ত 2.7 পর্যন্ত বিদ্যমান নেই। যেমন, পাইথন 2.7 সহ ম্যানুয়াল ব্যতিক্রম হ্যান্ডলিংয়ের কোন প্রয়োজন নেই।

পাইথন 2.7+:

pathlib ব্যবহার করে:

যদি আপনি করতে পারেন, pathlib নামে বর্তমান pathlib ব্যাকপোর্ট ইনস্টল করুন। pathlib নামে পুরোনো pathlib ব্যাকপোর্ট ইনস্টল করবেন না। এরপরে, উপরে পাইথন 3.5+ সেকশন পড়ুন এবং এটি একই ব্যবহার করুন।

os ব্যবহার করে:

import os
try: 
    os.makedirs(path)
except OSError:
    if not os.path.isdir(path):
        raise

যদিও একটি সাদাসিধা সমাধান প্রথম os.path.isdir ব্যবহার করে os.path.isdir অনুসরণ করতে পারে, উপরের সমাধান দুটি ক্রিয়াকলাপের ক্রমকে বিপরীত করে। এভাবে, এটি একটি সাধারণ জাতি শর্তকে বাধা দেয় যা ডিরেক্টরী তৈরি করার জন্য একটি সদৃশ প্রচেষ্টা করে এবং ডিরেক্টরি থেকে ফাইলগুলিকে বিচ্ছিন্ন করে।

উল্লেখ্য যে ব্যতিক্রমটি ধরে নেওয়া এবং errno ব্যবহার করে সীমিত উপকারিতা হয় কারণ OSError: [Errno 17] File exists , অর্থাৎ errno.EEXIST , উভয় ফাইল এবং ডিরেক্টরিগুলির জন্য উত্থাপিত হয়। ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করার জন্য এটি আরও নির্ভরযোগ্য।

বিকল্প:

mkpath nested ডিরেক্টরি তৈরি করে এবং ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে কিছুই করে না। এটি পাইথন 2 এবং 3 উভয় ক্ষেত্রে কাজ করে।

import distutils.dir_util
distutils.dir_util.mkpath(path)

প্রতি বাগ 10948 , এই বিকল্পটি একটি গুরুতর সীমাবদ্ধতা এটি একটি নির্দিষ্ট পাথের জন্য প্রতি পাইথন প্রক্রিয়া শুধুমাত্র একবার কাজ করে। অন্য কথায়, যদি আপনি একটি ডিরেক্টরি তৈরি করতে এটি ব্যবহার করেন, তবে পাইথনের অভ্যন্তরে বা বাইরে ডিরেক্টরিটি মুছুন এবং একই ডিরেক্টরি পুনরায় তৈরি করার জন্য আবার mkpath ব্যবহার করুন, mkpath তার ডিরেক্টরিটি তৈরি করার পূর্বে অবৈধ ক্যাশে তথ্য ব্যবহার করবে এবং আসলে আবার ডিরেক্টরি করতে হবে না। বিপরীতে, os.makedirs এই ধরনের ক্যাশে উপর নির্ভর করে না। এই সীমাবদ্ধতা কিছু অ্যাপ্লিকেশনের জন্য ঠিক হতে পারে।

ডিরেক্টরী মোডের বিষয়ে , যদি আপনি এটির যত্ন নিয়ে থাকেন তবে দয়া করে ডকুমেন্টেশনটি পড়ুন।


আপনি নিম্নলিখিত বিবেচনা করা হলে:

os.path.isdir('/tmp/dirname')

মানে একটি ডিরেক্টরি (পাথ) বিদ্যমান এবং একটি ডিরেক্টরি। সুতরাং আমার জন্য এই ভাবে কি প্রয়োজন। তাই আমি এটি ফোল্ডার (একটি ফাইল নয়) নিশ্চিত এবং বিদ্যমান হতে পারে।


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

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


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

পাইথন 3.5 থেকে শুরু হচ্ছে, pathlib.Path.mkdir একটি exist_ok পতাকা আছে:

from pathlib import Path
path = Path('/my/directory/filename.txt')
path.parent.mkdir(parents=True, exist_ok=True) 
# path.parent ~ os.path.dirname(path)

এটি পুনরাবৃত্তি করে ডিরেক্টরিটি তৈরি করে এবং ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকলে ব্যতিক্রমটি উত্থাপন করে না।

(ঠিক যেমন os.makedirs পাইথন থেকে শুরু একটি বিদ্যমান exists_ok পতাকা পেয়েছে 3.2)।


শেল ভাষাগুলিকে সমর্থন করে এমন একটি মেশিনে চলমান থাকলে কেন উপপরিচালক মডিউল ব্যবহার করবেন না? পাইথন 2.7 এবং পাইথন 3.6 এ কাজ করে

from subprocess import call
call(['mkdir', '-p', 'path1/path2/path3'])

অধিকাংশ সিস্টেমে কৌতুক করা উচিত।


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

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.makedirs চেক করুন: (এটি নিশ্চিত করে যে সম্পূর্ণ পথ বিদ্যমান।)
ডিরেক্টরিটি হ্যান্ডেল করার জন্য, Oserror ধরতে পারেন। (যদি exist_ok মিথ্যা হয় (ডিফল্ট), টার্গেট ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে একটি OSError উত্থাপিত হয়।)

import os
try:
    os.makedirs('./path/to/somewhere')
except OSError:
    pass

আমি হিকিকি টোভোয়েন এবং 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

আপনি 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 এর জন্য কাজ করে।


এক-মাছ ধরার সমাধানের জন্য, আপনি IPython.utils.path.ensure_dir_exists() ব্যবহার করতে পারেন:

from IPython.utils.path import ensure_dir_exists
ensure_dir_exists(dir)

documentation থেকে: একটি ডিরেক্টরি বিদ্যমান কিনা তা নিশ্চিত করুন। যদি এটি বিদ্যমান না থাকে, তাহলে এটি তৈরি করার চেষ্টা করুন এবং একটি জাতি শর্তের বিরুদ্ধে সুরক্ষা করুন যদি অন্য প্রক্রিয়াটি একই রকম হয়।


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

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

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 নামে একটি ডিরেক্টরি দিয়ে শেষ করতে যাচ্ছেন।







operating-system