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


4239

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

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(ধন্যবাদ কানজা, ব্লেয়ার এবং ডগলাস)। আমার এখন যা আছে:

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

"উন্মুক্ত" এর জন্য কি কোনও পতাকা রয়েছে, যা এটি স্বয়ংক্রিয়ভাবে ঘটায়?


27
সাধারণত ফাইল ক্ষেত্রে যে কোনও ডিরেক্টরি নেই সে ক্ষেত্রে আপনার অ্যাকাউন্টের প্রয়োজন হতে পারে। আমার মেশিনে ডেরনাম ('foo.txt') '' দেয়, যা বিদ্যমান নেই এবং মেকারদের () ব্যর্থ করে দেয়।
ব্রায়ান হকিন্স

11
পাইথনে ২.7 এর os.path.mkdirঅস্তিত্ব নেই। এটা os.mkdir
ড্রিভিকো

6
যদি পথটি বিদ্যমান থাকে তবে কেবল এটি ডিরেক্টরি নেই এবং এটি নিয়মিত ফাইল বা অন্য কোনও বস্তু নয় কিনা তা পরীক্ষা করার জন্য নয় (অনেক উত্তর এটি পরীক্ষা করে) এটিও লেখার যোগ্য কিনা তা পরীক্ষা করাও প্রয়োজনীয় (এটি উত্তর খুঁজে পেল না যা এটি পরীক্ষা করে দেখেছিল)
चमत्कार 173

9
আপনি যদি এখানে ফাইল পাথ স্ট্রিংয়ের মূল ডিরেক্টরি তৈরি করতে এসেছিলেন pতবে আমার কোড স্নিপেট এখানে রয়েছে:os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True)
থমমে গওদা

উত্তর:


5180

পাইথন ≥ 3.5 এ, ব্যবহার করুন pathlib.Path.mkdir:

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

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

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

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

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

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

import os, errno

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

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

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

পাইথনের আধুনিক সংস্করণগুলি এই কোডটি কিছুটা উন্নত করে, উভয়ই প্রকাশ করে FileExistsError(3.3+) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... এবং অনুমতি দিয়ে একটি শব্দ যুক্তি os.makedirsনামকexist_ok (3.2+ মধ্যে)।

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

5
দৌড় শর্তটি একটি ভাল পয়েন্ট, তবে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২২73১৯২/২২২73২০৮৮ এ পদ্ধতির ডিরেক্টরি তৈরি করতে ব্যর্থতার মুখোশ দেবে। ভোট দেওয়ার পক্ষে খারাপ বোধ করবেন না - উত্তরটি আপনার পছন্দ নয়। এটিই ভোটের জন্য।
ব্লেয়ার কনরাড

27
মনে রাখবেন যে os.path.exists () নিখরচায় নয়। যদি সাধারণ কেসটি হয় যে ডিরেক্টরিটি সেখানে থাকবে, তবে এটির ক্ষেত্রে এটি ব্যতিক্রম হিসাবে পরিচালনা করা উচিত। অন্য কথায়, আপনার ফাইলটি খোলার এবং লেখার চেষ্টা করুন, ওএসআরর ব্যতিক্রম ধরুন এবং এরনোর ভিত্তিতে আপনার মেকডির () করুন এবং পুনরায় চেষ্টা করুন বা পুনরায় উত্থাপন করুন। আপনি স্থানীয় পদ্ধতিতে লেখাটি মোড়ানো না হলে এটি কোডের নকল তৈরি করে।
অ্যান্ড্রু

22
os.path.existsTrueএকটি ফাইলের জন্যও ফেরত দেয় । আমি এটার সমাধান করার জন্য একটি উত্তর পোস্ট করেছি।
একিউম্যানাস

13
এখানে অন্যান্য উত্তরের মন্তব্যকারীরা যেমন উল্লেখ করেছেন, পাইথন ৩.২ থেকে যেহেতু পথের পূর্বের অস্তিত্বটি কীভাবে পরিচালনা করা হবে তা বোঝাতে exists_okপ্যারামিটারটি os.makedirs()ব্যবহার করা যেতে পারে।
বোবল 20'13

6
os.mkdirs()কোনও পাথ বিভাজনকারী দুর্ঘটনাক্রমে ছেড়ে গেলে, বর্তমান ফোল্ডারটি প্রত্যাশার মতো না হলে কোনও পাথ উপাদানটিতে পাথ বিভাজক থাকে। আপনি যদি os.mkdir()এই বাগগুলি ব্যবহার করেন তবে একটি ব্যতিক্রম বাড়াবে, তাদের অস্তিত্ব সম্পর্কে আপনাকে সতর্ক করে।
ড্রিভিকো

1240

পাইথন 3.5+:

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

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

পাইথন ৩.২++:

ব্যবহার pathlib:

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

পাইথন ৩.৪ ব্যবহার করে যদি এটি আসে তবে এটি pathlibকার্যকর exist_okবিকল্পটি অনুপস্থিত । ব্যাকপোর্টটি একটি নতুন এবং উচ্চতর প্রয়োগের অফার করার উদ্দেশ্যে তৈরি করা হয়েছে mkdirযার মধ্যে এই অনুপস্থিত বিকল্পটি অন্তর্ভুক্ত রয়েছে।

ব্যবহার os:

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

os.makedirsউপরে ব্যবহৃত হিসাবে পুনরাবৃত্তভাবে ডিরেক্টরি তৈরি করে এবং ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে একটি ব্যতিক্রম বাড়ায় না। এটির মধ্যে exist_okকেবলমাত্র পাইথন ৩.২++ এর ডিফল্ট মান রয়েছে ifচ্ছিক যুক্তি রয়েছে False। পাইথন 2.x এ 2.7 পর্যন্ত এই যুক্তিটির অস্তিত্ব নেই। যেমনটি পাইথন ২.7-তে ম্যানুয়াল ব্যতিক্রম হ্যান্ডলিংয়ের দরকার নেই।

পাইথন ২.7++:

ব্যবহার pathlib:

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

ব্যবহার os:

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

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

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

বিকল্প:

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

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

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


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


13
এই উত্তরটি যতদূর আমি বলতে পারি প্রতিটি বিশেষ ক্ষেত্রে জুড়ে। আমি এটি "যদি না os.path.isdir ()" এ মোড়ানোর পরিকল্পনা করি তবে যেহেতু আমি প্রায় প্রতিবারই ডিরেক্টরিটি উপস্থিত থাকার প্রত্যাশা করি এবং আমি সেই ব্যতিক্রমটি এড়াতে পারি।
চার্লস এল।

5
@CharlesL। যদি আপনার কারণটি পারফরম্যান্স করে তবে একটি ব্যতিক্রম চেকের ডিস্ক আইওর চেয়ে সম্ভবত সস্তা।
jpmc26

1
@ jpmc26 তবে মেকার্ডরা কেবল ওএসরর নিক্ষেপ করার জন্য পরীক্ষা করলে অতিরিক্ত স্ট্যাটাস, উমাস্ক, লাস্ট্যাট করে।
kwarunek

4
এটি একটি ভুল উত্তর, কারণ এটি একটি সম্ভাব্য এফএস রেস কনডের পরিচয় দেয়। অ্যারন হল থেকে উত্তর দেখুন।
স্লিডকেল

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

604

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

import os
import errno

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

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


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

15
ব্যতিক্রমটি কেবল তখনই exception.errno != errno.EEXISTউত্থাপিত হবে যখন পথ অস্তিত্বহীনভাবে কেসটিকে উপেক্ষা করবে কিন্তু কোনও ডিরেক্টরি নয় এমন একটি ডিরেক্টরি যেমন একটি ফাইল। ব্যতিক্রমটি আদর্শভাবে উত্থাপিত হওয়া উচিত যদি পথটি কোনও ডিরেক্টরি ডিরেক্টরি নয়।
একিউম্যানাস

178
উল্লেখ্য যে উপরের কোডটি সমানos.makedirs(path,exist_ok=True)
নবীন

58
@ নাভিন exist_okপ্যারামিটারটি পাইথন ৩.২-এ চালু করা হয়েছিল। পাইথন ২.x এ এটি উপস্থিত নেই। আমি আমার উত্তরে এটি অন্তর্ভুক্ত করব।
একিউম্যানাস

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

102

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

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

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


8
আপনি যদি কেবল 'isdir' ব্যবহার করেন, আপনি ডিরেক্টরি তৈরি করার চেষ্টা করার পরেও একই সমস্যা নেই এবং একই নামের ফাইলটি ইতিমধ্যে উপস্থিত রয়েছে?
মিঃ ওয়ান্ডারফুল

3
@ মিঃ ওয়ান্ডারফুল একটি বিদ্যমান ফাইলের উপরে ডিরেক্টরি তৈরি করার সময় ব্যতিক্রমগুলি সঠিকভাবে কলারের কাছে প্রতিফলিত করবে।
দামিয়ান ইয়ারিক

79

চেক করুন os.makedirs: (এটি নিশ্চিত করে যে পুরো পাথটি বিদ্যমান।)
ডিরেক্টরিটি বিদ্যমান থাকতে পারে তা হ্যান্ডেল করতে, ধরুন OSError। (যদি exist_okহয় False(ডিফল্ট একটি), OSErrorযদি লক্ষ্য নির্দেশিকা ইতিমধ্যেই বিদ্যমান আছে উত্থাপিত হয়।)

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

19
চেষ্টা করে / বাদে ডিরেক্টরিটি তৈরির ক্ষেত্রে আপনি ত্রুটিগুলি মাস্ক করে ফেলবেন, যখন ডিরেক্টরিটি উপস্থিত ছিল না তবে কোনও কারণে আপনি এটি তৈরি করতে পারবেন না
ব্লেয়ার কনরাড

3
OSErrorপাথটি যদি কোনও বিদ্যমান ফাইল বা ডিরেক্টরি হয় তবে এখানে উত্থাপিত হবে। আমি এটার সমাধান করার জন্য একটি উত্তর পোস্ট করেছি।
একিউম্যানাস

4
এইখানে অর্ধেক। OSErrorএটিকে এড়িয়ে যাওয়ার সিদ্ধান্ত নেওয়ার আগে আপনাকে সাব-ত্রুটি শর্তটি পরীক্ষা করতে হবে। স্ট্যাকওভারফ্লো . com/a/5032238/763269 দেখুন ।
ক্রিস জনসন 21

70

পাইথন 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একটি exist_okপতাকা পেয়েছিল os.makedirs(path, exist_ok=True))


46

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

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

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

আমরা বিল্টিন ফাংশন ওভাররাইট করা এড়াতে চাই dir,। এছাড়াও, filepathবা সম্ভবত 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)

ডিরেক্টরি বা ফাইল যদি না থাকে তবে আপনি IOErrorএকটি সম্পর্কিত ত্রুটি নম্বর সহ একটি পাবেন : 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)

34

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

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

3
আমি প্রশ্নটি করতে যাচ্ছিলাম, তবে আমরা কী os.mkdir বলতে চাইছি? আমার অজগর (২.২.২) এর কোন os.path.mkdir নেই ....
ব্লেয়ার কনরাড

1
কোন os.path.mkdir()পদ্ধতি নেই। os.path মডিউলটি পথের নামগুলিতে কিছু কার্যকর ফাংশন প্রয়োগ করে
সার্জ এস

31

আমি নিচে লিখে রেখেছি। যদিও এটি সম্পূর্ণ নির্বোধ নয়।

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

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



দুটি সমস্যা: (১) আপনাকে চেক করার সিদ্ধান্ত নেওয়ার আগে OSError এর সাব-ত্রুটি শর্তটি পরীক্ষা করা দরকার os.path.exists- দেখুন stackoverflow.com/a/5032238/763269, এবং (২) সাফল্যের os.path.existsঅর্থ ডিরেক্টরিটি বিদ্যমান নেই, কেবল সেই পথ বিদ্যমান - একটি ফাইল, বা একটি সিমিলিংক, বা অন্য ফাইল সিস্টেম অবজেক্ট হতে পারে।
ক্রিস জনসন

24

ডিরেক্টরি আছে কিনা তা পরীক্ষা করে দেখুন এবং প্রয়োজনে এটি তৈরি করুন?

এর সরাসরি উত্তর হ'ল এমন একটি সাধারণ পরিস্থিতি ধরে নেওয়া যেখানে আপনি অন্যান্য ব্যবহারকারী বা প্রক্রিয়াগুলি আপনার ডিরেক্টরিতে গণ্ডগোলের প্রত্যাশা করবেন না:

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:

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প্রচুর পদ্ধতির সাথে একটি নতুন অবজেক্ট রয়েছে (৩.৪.২ হিসাবে) যে কেউ পাথের সাথে ব্যবহার করতে চাইবে - এর মধ্যে একটি mkdir

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

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

from pathlib import Path
import tempfile

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

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

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

directory.mkdir(exist_ok=True)

এখানে নথির প্রাসঙ্গিক অংশটি রয়েছে :

যদি 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))

Pathstrঅন্যান্য API গুলি যে strপাথগুলি ব্যবহার করতে পারে আশা করে তাদের আগে অবজেক্টগুলিকে জোর করতে হবে।

অ্যাবস্ট্রাক্ট বেস ক্লাসের উদাহরণগুলি গ্রহণ করার জন্য সম্ভবত পান্ডাগুলি আপডেট করা উচিত os.PathLike


20

পাইথন ৩.৪-এ আপনি একেবারে নতুন 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.

@JanuszSkonieczny pypi.python.org/pypi/pathlib2 নতুন গুলো পুরনো নয়। বয়স্কটি বুদ্ধিহীন।
একিউম্যানাস

যেমনটি এটি রেডমিমে প্রথম লাইনে বলা হয়েছে; পি। তবে পুরানো ব্যাকপোর্টটি এখানে উত্তরের জন্য এখনও বৈধ। এবং মাথা ব্যাথা নামকরণ হয় না। ব্যাখ্যা করতে কেন এবং কখন ব্যবহার করতে কোন প্রয়োজন নেই pathlibএবং যেখানে pathlib2); নতুন ব্যবহারকারীদের জন্য, এবং আমি মনে করি অনুকূল এখানে থামিয়ে দেওয়া জিনিসটা হবে
Janusz Skonieczny

13

প্রাসঙ্গিক পাইথন ডকুমেন্টেশন ব্যবহারের প্রস্তাব দেওয়া শৈলী কোডিং (সহজ অনুমতি চেয়ে ক্ষমা চাইতে বললেন) 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

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

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


11

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

os.makedirs(path,exist_ok=True)

ইন Python2 , 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

11

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

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

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


এখানে নতুন আইপিথন ডকুমেন্টেশন উপলব্ধ
জেকেদেব

3
IPythonমডিউল একেবারে উপস্থিত হতে নিশ্চিত নয়। এটি মূলত আমার ম্যাকের সাথে উপস্থিত রয়েছে তবে পাইথনের আমার কোনও লিনাক্স ইনস্টল নেই। মূলত, এটি পাইথন মডিউল সূচীতে তালিকাভুক্ত মডিউলগুলির মধ্যে একটি নয় ।
একিউম্যানাস

1
অবশ্যই। প্যাকেজটি ইনস্টল করার জন্য, কেবল স্বাভাবিক চালান pip install ipythonবা আপনার প্রয়োজনীয়তার মধ্যে নির্ভরতা অন্তর্ভুক্ত করুন । Txt বা pom.xML । ডকুমেন্টেশন: ipython.org/install.html
tashuhka

9

তুমি ব্যবহার করতে পার 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 এর জন্য কাজ করে।


2
distutils.dir_utilডিসটুইটেল পাবলিক এপিআইয়ের একটি অংশ নয় এবং বহু থ্রেডযুক্ত
পড

1
হ্যাঁ. বাগের প্রথম বার্তায় যেমন উল্লেখ করা হয়েছে , সমস্যাটি distutils.dir_util.mkpathহ'ল যদি আপনি একটি ডিরেক্টরি তৈরি করেন, তবে এটি পাইথনের ভিতরে বা বাইরে থেকে মুছুন, তারপরে mkpathআবার ব্যবহার করুন , mkpathকেবল ডিরেক্টরিটি তৈরি করার আগে তার অবৈধ ক্যাশেড তথ্য ব্যবহার করবে এবং আসলে ডিরেক্টরি আবার না। বিপরীতে, os.makedirsএই জাতীয় কোনও ক্যাশে ভরসা করবেন না।
একিউম্যানাস

8

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

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


6

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

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

এটি প্রশ্নের উত্তর দেয় না
জর্জি

6

আমি এই প্রশ্নোত্তর পেয়েছি এবং আমি পেয়েছিলাম যে ব্যর্থতা এবং ত্রুটিগুলি পেয়েছিলাম সেগুলি নিয়ে প্রাথমিকভাবে আমি হতবাক হয়েছি। আমি পাইথন 3 (আর্চ লিনাক্স x86_64 সিস্টেমে একটি অ্যানাকোন্ডা ভার্চুয়াল পরিবেশে v.3.5) এ কাজ করছি।

এই ডিরেক্টরি কাঠামো বিবেচনা করুন:

└── output/         ## dir
   ├── corpus       ## file
   ├── corpus2/     ## dir
   └── subdir/      ## dir

এখানে আমার পরীক্ষাগুলি / নোটগুলি দেওয়া হয়েছে, যা বিষয়গুলিকে স্পষ্ট করে:

# ----------------------------------------------------------------------------
# [1] /programming/273192/how-can-i-create-a-directory-if-it-does-not-exist

import pathlib

""" Notes:
        1.  Include a trailing slash at the end of the directory path
            ("Method 1," below).
        2.  If a subdirectory in your intended path matches an existing file
            with same name, you will get the following error:
            "NotADirectoryError: [Errno 20] Not a directory:" ...
"""
# Uncomment and try each of these "out_dir" paths, singly:

# ----------------------------------------------------------------------------
# METHOD 1:
# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## no error but no dir created (missing tailing /)
# out_dir = 'output/corpus3/'               ## works
# out_dir = 'output/corpus3/doc1'           ## no error but no dir created (missing tailing /)
# out_dir = 'output/corpus3/doc1/'          ## works
# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but no file created (os.makedirs creates dir, not files!  ;-)
# out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
# out_dir = 'output/corpus3/tfidf/'         ## works
# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# [2] https://docs.python.org/3/library/os.html#os.makedirs

# Uncomment these to run "Method 1":

#directory = os.path.dirname(out_dir)
#os.makedirs(directory, mode=0o777, exist_ok=True)

# ----------------------------------------------------------------------------
# METHOD 2:
# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## works
# out_dir = 'output/corpus3/'               ## works
# out_dir = 'output/corpus3/doc1'           ## works
# out_dir = 'output/corpus3/doc1/'          ## works
# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but creates a .../doc.txt./ dir
# out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
# out_dir = 'output/corpus3/tfidf/'         ## works
# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# Uncomment these to run "Method 2":

#import os, errno
#try:
#       os.makedirs(out_dir)
#except OSError as e:
#       if e.errno != errno.EEXIST:
#               raise
# ----------------------------------------------------------------------------

উপসংহার: আমার মতে, "পদ্ধতি 2" আরও শক্তিশালী।

[1] ডিরেক্টরিটি না থাকলে আমি কীভাবে এটি তৈরি করতে পারি?

[২] https://docs.python.org/3/library/os.html#os.makedirs


6

আমি হাইক্কি টোভোনেন এবং এবিবি'র উত্তরগুলি দেখেছি এবং এই প্রকরণটির বিষয়ে চিন্তাভাবনা করেছি।

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


5

বিকল্প mkdirসহ কমান্ড সমর্থন করে এমন কোনও মেশিনে চালিত হলে সাবপ্রসেস মডিউলটি ব্যবহার করবেন না কেন -p? পাইথন 2.7 এবং অজগর 3.6 এ কাজ করে

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

বেশিরভাগ সিস্টেমে কৌশলটি করা উচিত।

পোর্টেবিলিটিটি গুরুত্বপূর্ণ নয় এমন পরিস্থিতিতে (প্রাক্তন, ডকার ব্যবহার করে) সমাধানটি একটি পরিষ্কার 2 লাইন। ডিরেক্টরি রয়েছে কি না তা পরীক্ষা করার জন্য আপনার যুক্তিও যুক্ত করতে হবে না। অবশেষে, কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই পুনরায় চালানো নিরাপদ

আপনার যদি পরিচালনা করতে ত্রুটির প্রয়োজন হয়:

from subprocess import check_call
try:
    check_call(['mkdir', '-p', 'path1/path2/path3'])
except:
    handle...

4

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

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

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


এটি কীভাবে একটি ডিরেক্টরি তৈরির প্রশ্নের উত্তর দেয় ?
জর্জি

3

create_dir()আপনার প্রোগ্রাম / প্রকল্পের এন্ট্রি পয়েন্টে ফাংশনটি কল করুন ।

import os

def create_dir(directory):
    if not os.path.exists(directory):
        print('Creating Directory '+directory)
        os.makedirs(directory)

create_dir('Project directory')

3

ডিরেক্টরি তৈরির আগে আপনাকে পুরো পথটি নির্ধারণ করতে হবে:

import os,sys,inspect
import pathlib

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
your_folder = currentdir + "/" + "your_folder"

if not os.path.exists(your_folder):
   pathlib.Path(your_folder).mkdir(parents=True, exist_ok=True)

এটি আমার পক্ষে কাজ করে এবং আশা করি, এটি আপনার পক্ষেও কাজ করবে


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

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

এটি যদি ফাইলটি না থাকে তবে তা এটি তৈরি করে কিনা তা যাচাই করবে।

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