try
বিবৃতি ব্যবহার না করে কোনও ফাইল উপস্থিত রয়েছে কি না তা আমি কীভাবে চেক করব ?
try
বিবৃতি ব্যবহার না করে কোনও ফাইল উপস্থিত রয়েছে কি না তা আমি কীভাবে চেক করব ?
উত্তর:
যদি আপনি যাচাই করার কারণটি হন তবে আপনি যেমন কিছু করতে পারেন তবে if file_exists: open_it()
এটি try
খোলার প্রয়াসের চারপাশে ব্যবহার করা আরও নিরাপদ । চেক করা এবং তারপরে খোলার ফলে ফাইলটি মুছে ফেলা বা সরিয়ে নেওয়া বা আপনি যখন যাচাই করেন এবং যখন আপনি এটি খোলার চেষ্টা করেন তখন এর মধ্যে কিছু ঝুঁকিপূর্ণ হয়।
আপনি যদি ফাইলটি তাত্ক্ষণিকভাবে খোলার পরিকল্পনা না করেন তবে আপনি এটি ব্যবহার করতে পারেন os.path.isfile
True
পথে যদি কোনও নিয়মিত ফাইল থাকে তবে ফিরে আসুন । এটি প্রতীকী লিঙ্কগুলি অনুসরণ করে, সুতরাং islink () এবং isfile () উভয়ই একই পথের জন্য সত্য হতে পারে।
import os.path
os.path.isfile(fname)
আপনার যদি নিশ্চিত হওয়া দরকার তবে এটি একটি ফাইল।
পাইথন ৩.৪ দিয়ে শুরু করে pathlib
মডিউলটি একটি অবজেক্ট-ভিত্তিক পদ্ধতির প্রস্তাব দেয় ( pathlib2
পাইথন ২.7 এ ব্যাকপোর্ট করা হয়েছে):
from pathlib import Path
my_file = Path("/path/to/file")
if my_file.is_file():
# file exists
ডিরেক্টরি চেক করতে, করুন:
if my_file.is_dir():
# directory exists
কোনও Path
বস্তু এটি ফাইল বা ডিরেক্টরি কিনা তা স্বাধীনভাবে বিদ্যমান কিনা তা পরীক্ষা করতে , ব্যবহার করুন exists()
:
if my_file.exists():
# path exists
আপনি resolve(strict=True)
একটি try
ব্লকেও ব্যবহার করতে পারেন :
try:
my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
# doesn't exist
else:
# exists
FileNotFoundError
পাইথন 3. চালু হয় আপনার কাছে পাইথন 2.7 সেইসাথে পাইথন 3 সমর্থন করার জন্য প্রয়োজন হয়, তাহলে আপনি ব্যবহার করতে পারেন IOError
পরিবর্তে (যা FileNotFoundError
উপশ্রেণী) stackoverflow.com/a/21368457/1960959
open('file', 'r+')
) এবং তারপরে শেষের দিকে যেতে চেষ্টা করুন।
আপনার os.path.exists
কাজটি রয়েছে:
import os.path
os.path.exists(file_path)
এটি True
ফাইল এবং ডিরেক্টরি উভয়ের জন্যই ফিরে আসে তবে আপনি পরিবর্তে এটি ব্যবহার করতে পারেন
os.path.isfile(file_path)
এটি বিশেষত কোনও ফাইল কিনা তা পরীক্ষা করতে। এটি symlinks অনুসরণ করে।
বিপরীতে isfile()
, ডিরেক্টরিতে exists()
ফিরে আসবে True
। আপনি শুধুমাত্র প্লেইন ফাইল বা এছাড়াও ডিরেক্টরি চান তার উপর নির্ভর করে সুতরাং, আপনি ব্যবহার করব isfile()
বা exists()
। এখানে কিছু সাধারণ রিপেল আউটপুট দেওয়া হচ্ছে:
>>> os.path.isfile("/etc/password.txt")
True
>>> os.path.isfile("/etc")
False
>>> os.path.isfile("/does/not/exist")
False
>>> os.path.exists("/etc/password.txt")
True
>>> os.path.exists("/etc")
True
>>> os.path.exists("/does/not/exist")
False
ব্যবহার করুন os.path.isfile()
সঙ্গে os.access()
:
import os
PATH = './file.txt'
if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
print("File exists and is readable")
else:
print("Either the file is missing or not readable")
os.access()
মিথ্যা ফিরবে।
import os
, তাই আপনার আর প্রয়োজন হবে import os.path
না কারণ এটি ইতিমধ্যে অংশ os
। আপনার কেবলমাত্র আমদানি করা দরকার os.path
যদি আপনি কেবল নিজের os.path
থেকে os
নয় বরং কোনও ছোট জিনিসটি আমদানি করতে ফাংশন ব্যবহার করতে যাচ্ছেন তবে আপনি যেমন ব্যবহার করেন os.access
এবং os.R_OK
দ্বিতীয় আমদানির প্রয়োজন হয় না।
import os
os.path.exists(path) # Returns whether the path (directory or file) exists or not
os.path.isfile(path) # Returns whether the file exists or not
যদিও প্রায় প্রতিটি সম্ভাব্য উপায় বিদ্যমান উত্তরগুলিতে (কমপক্ষে একটির মধ্যে) তালিকাভুক্ত করা হয়েছে (উদাহরণস্বরূপ পাইথন ৩.৪ নির্দিষ্ট জিনিস যুক্ত করা হয়েছিল), তবে আমি সমস্ত কিছু একসাথে ভাগ করে নেওয়ার চেষ্টা করব।
দ্রষ্টব্য : পাইথন স্ট্যান্ডার্ড লাইব্রেরি কোডের প্রতিটি অংশ যা আমি পোস্ট করতে যাচ্ছি এটি সংস্করণ 3.5.3 এর সাথে সম্পর্কিত ।
সমস্যার বিবৃতি :
সম্ভাব্য সমাধান :
[পাইথন 3]: os.path। বিদ্যমান ( পথ ) (এছাড়াও মত অন্যান্য ফাংশন পরিবারের সদস্যদের পরীক্ষা os.path.isfile
, os.path.isdir
, os.path.lexists
কিছুটা ভিন্ন আচরণে জন্য)
os.path.exists(path)
পাথ
True
যদি কোনও বিদ্যমান পাথ বা একটি উন্মুক্ত ফাইল বর্ণনাকারীকে বোঝায় তবে ফিরে আসুন । ভাঙা প্রতীকী লিঙ্কগুলির জন্য ফিরে আসে । কিছু প্ল্যাটফর্মে, অনুরোধ করা ফাইলটিতে OS.stat () চালানোর অনুমতি না দেওয়া হলেও, পথটি শারীরিকভাবে বিদ্যমান থাকলেও এই ফাংশনটি ফিরে আসতে পারে ।False
False
সমস্ত ভাল, তবে আমদানি গাছ অনুসরণ করে:
os.path
- posixpath.py ( ntpath.py )
জেনেরিকপথ.পি , লাইন ~ # 20 +
def exists(path):
"""Test whether a path exists. Returns False for broken symbolic links"""
try:
st = os.stat(path)
except os.error:
return False
return True
এটি [পাইথন 3] এর আশপাশে কেবল একটি চেষ্টা / ব্লক ব্যতীত : ওএস। স্ট্যাটাস ( পথ, *, dir_fd = কিছুই নয়, অনুসরণ_সৃঙ্খলাগুলি = সত্য ) । সুতরাং, আপনার কোডটি হল চেষ্টা / ব্যতীত মুক্ত, কিন্তু framestack কম সেখানে (অন্তত) এর এক ধরনের ব্লক। এটি অন্যান্য ফানকগুলিতে ( সহ os.path.isfile
) প্রযোজ্য ।
1.1। [পাইথন 3]: পথ। is_file ()
হুডের নীচে, এটি ঠিক একই জিনিসটি করে ( প্যাথলিব.পি , লাইন ~ # 1330 ):
def is_file(self):
"""
Whether this path is a regular file (also True for symlinks pointing
to regular files).
"""
try:
return S_ISREG(self.stat().st_mode)
except OSError as e:
if e.errno not in (ENOENT, ENOTDIR):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
return False
[পাইথন 3]: বিবৃতি প্রসঙ্গে পরিচালকগণের সাথে । উভয় ক্ষেত্রেই:
একটি তৈরী কর:
class Swallow: # Dummy example
swallowed_exceptions = (FileNotFoundError,)
def __enter__(self):
print("Entering...")
def __exit__(self, exc_type, exc_value, exc_traceback):
print("Exiting:", exc_type, exc_value, exc_traceback)
return exc_type in Swallow.swallowed_exceptions # only swallow FileNotFoundError (not e.g. TypeError - if the user passes a wrong argument like None or float or ...)
এবং এর ব্যবহার - আমি আচরণটির প্রতিলিপি করব os.path.isfile
(নোট করুন যে এটি কেবল প্রদর্শনের উদ্দেশ্যে, উত্পাদনের জন্য এই জাতীয় কোড লেখার চেষ্টা করবেন না ):
import os
import stat
def isfile_seaman(path): # Dummy func
result = False
with Swallow():
result = stat.S_ISREG(os.stat(path).st_mode)
return result
[পাইথন 3] ব্যবহার করুন : প্রসঙ্গ লিবিব। দমন ( * ব্যতিক্রম ) - যা নির্দিষ্টভাবে ব্যতিক্রমগুলি নির্বাচন করার জন্য ডিজাইন করা হয়েছিল
কিন্তু, তারা উপর চাদরে হবে বলে মনে হচ্ছে ব্যবহার করে দেখুন / ব্যতীত / অন্য / পরিশেষে ব্লক, যেমন [পাইথন 3]: সঙ্গে বিবৃতি পদ বলে:
এর ফলে সাধারণ ব্যবহার করে দেখুন ... ব্যতীত ... পরিশেষে ব্যবহার নিদর্শন সুবিধাজনক পুনঃব্যবহারের জন্য encapsulated করা হবে।
ফাইল সিস্টেম ট্র্যাভারসাল ফাংশন (এবং আইটেমগুলির সাথে ম্যাচের ফলাফলগুলি অনুসন্ধান করুন)
[পাইথন 3]: ওএস। listdir ( পাথ = '।' ) (বা [পাইথন 3]: পাইথন ভি 3.5 + তে স্ক্যান্ডির ( পথ = '।' ) , ব্যাকপোর্ট: [পিপিআইআই: স্ক্যান্ডির )
ফণা অধীনে, উভয় ব্যবহার:
[গিটহাব] এর মাধ্যমে : পাইথন / সিপাইথন - (মাস্টার) সিপিথন / মডিউল / পিক্সিমোডিউল।
ব্যবহার scandir () এর পরিবর্তে listdir () উল্লেখযোগ্যভাবে, কোড যে ফাইল টাইপ বা ফাইল অ্যাট্রিবিউট তথ্যের প্রয়োজন কর্মক্ষমতা বৃদ্ধি করতে পারেন কারণ os.DirEntry বস্তু এই তথ্য প্রকাশ হলে ডিরেক্টরির স্ক্যান যদি অপারেটিং সিস্টেম এটি প্রদান করে। সকল os.DirEntry পদ্ধতি একটি সিস্টেম কল, কিন্তু সঞ্চালন করা সম্ভব is_dir () এবং is_file () সাধারণত সিম্বলিক লিঙ্কের জন্য একটি সিস্টেম কল প্রয়োজন; os.DirEntry.stat () সর্বদা ইউনিক্সে একটি সিস্টেম কল প্রয়োজন তবে উইন্ডোজে প্রতীকী লিঙ্কগুলির জন্য কেবল একটির প্রয়োজন।
os.listdir
( os.scandir
যখন উপলব্ধ থাকে)glob.glob
:)
os.listdir
ফোল্ডার উপর এই বারবার, তারা আমাদের সমস্যার জন্য অদক্ষ হয় (বেশিরভাগ ক্ষেত্রে) যেহেতু (সেখানে ব্যতিক্রম, অ ওয়াইল্ডকার্ডযুক্ত মত উল্লিখিত glob তাই আমি তাদের পীড়াপীড়ি যাচ্ছি না, - যেমন @ShadowRanger নির্দিষ্ট Bing)। কিছু ক্ষেত্রে ফাইল নাম প্রসেসিংয়ের প্রয়োজন হতে পারে তা উল্লেখ করার দরকার নেই।
[পাইথন 3]: ওএস। অ্যাক্সেস ( পাথ, মোড, *, দির_এফডি = কোনওটি নয়, কার্যকর_আইডিএস = মিথ্যা, অনুসরণ_সাইক্লিংকস = সত্য ) যার আচরণটি নিকটে os.path.exists
(আসলে এটি বৃহত্তর, মূলত 2 তম যুক্তির কারণে)
... পরীক্ষা আবাহন ব্যবহারকারীকে নির্দিষ্ট অ্যাক্সেস আছে যদি পথ । মোড হওয়া উচিত F_OK পথের অস্তিত্ব পরীক্ষা করার জন্য ...
os.access("/tmp", os.F_OK)
যেহেতু আমি কাজ করতে সি , আমি ভাল হিসাবে এই পদ্ধতি ব্যবহার কারণ ফণা অধীন, এটা আহ্বান নেটিভ এপিআই গুলি (আবার, মাধ্যমে "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" ), কিন্তু এটি সম্ভব জন্য একটি গেট খুলে ব্যবহারকারী ত্রুটিগুলি , এবং এটি অন্যান্য রূপগুলির মতো পাইথন আইসির মতো নয় । সুতরাং, @ অ্যারোনহল যথাযথভাবে উল্লেখ করেছেন, আপনি কী করছেন তা যদি না জানেন তবে এটি ব্যবহার করবেন না:
দ্রষ্টব্য : নেটিভ API গুলি কল করা [পাইথন 3] এর মাধ্যমেও সম্ভব : সিটিপস - পাইথনের জন্য একটি বিদেশী ফাংশন লাইব্রেরি , তবে বেশিরভাগ ক্ষেত্রে এটি আরও জটিল।
( উইন নির্দিষ্ট): যেহেতু vcruntime * ( msvcr * ) .dll রপ্তানির একটি [MS.Docs]: _access, _waccess ফাংশন পরিবার হিসাবে ভাল, এখানে একটি উদাহরণ আছে:
Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import os, ctypes >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe", os.F_OK) 0 >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe.notexist", os.F_OK) -1
দ্রষ্টব্য :
os.F_OK
কলটিতে ব্যবহার করছি তবে এটি কেবল স্পষ্টতার জন্য (এর মান 0 )
পাশাপাশি Lnx ( Ubtu (16 x64) ) অংশটিও :
Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os, ctypes >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp", os.F_OK) 0 >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp.notexist", os.F_OK) -1
দ্রষ্টব্য :
পরিবর্তে hardcoding libc এর পথ ( "/lib/x86_64-linux-gnu/libc.so.6" ) যা হতে পারে (এবং সম্ভবত, হবে) সিস্টেম, জুড়ে পরিবর্তিত হতে কোনটি (অথবা খালি স্ট্রিং) প্রেরণ করা সম্ভব CDLL কন্সট্রাকটর ( ctypes.CDLL(None).access(b"/tmp", os.F_OK)
)। [Man7] অনুসারে : DLOPEN (3) :
যদি ফাইলের নাম নুল হয়, তবে প্রত্যাবর্তিত হ্যান্ডেলটি মূল প্রোগ্রামটির জন্য। Dlsym () এ দেওয়া হলে , এই হ্যান্ডেলটি মূল প্রোগ্রামে একটি প্রতীকের সন্ধানের কারণ হয়ে থাকে, তারপরে প্রোগ্রাম স্টার্টআপে লোড হওয়া সমস্ত ভাগ করে নেওয়া অবজেক্ট এবং তারপরে RTLD_GLOBAL পতাকা সহ dlopen () দ্বারা লোড করা সমস্ত ভাগ করা অবজেক্ট থাকে ।
__declspec(dllexport)
(কেন পৃথিবীতে নিয়মিত ব্যক্তি তা করতে হবে?), প্রধান প্রোগ্রাম লোড করার যোগ্য কিন্তু প্রায় কাছাকাছি অব্যবহারযোগ্য হয়ফাইল সিস্টেমের ক্ষমতা সহ কিছু তৃতীয় পক্ষের মডিউল ইনস্টল করুন
সম্ভবত, উপরের কোনও একটির উপর নির্ভর করবে (সম্ভবত সামান্য কাস্টমাইজেশন সহ)।
একটি উদাহরণ হ'ল (আবার উইন স্পেসিফিক) [গিটহাব]: মুহমন্ড / পাইউইন 32 - উইন্ডোজ (পাইওয়াইন 32) এক্সটেনশনের জন্য পাইথন , যা উইনাপির উপর পাইথন র্যাপার ।
তবে, যেহেতু এটি আরও কাজের মতো, তাই আমি এখানেই থামছি।
আরেকটি (খোঁড়া) কার্যসংক্রান্ত ( gainarie ) (যেমন আমি এটা কল করতে চান,) হয় sysadmin পদ্ধতির: ব্যবহার পাইথন একটি লেফাফা যেমন শেল কমান্ড চালানো
জয় :
(py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe\" > nul 2>&1'))" 0 (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe.notexist\" > nul 2>&1'))" 1
তুষার ( Lnx ( Ubtu )):
[cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))" 0 [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))" 512
নীচের লাইন :
চূড়ান্ত নোট (গুলি) :
glob.iglob
(এবং glob.glob
পাশাপাশি) ভিত্তিকos.scandir
, তাই এটি এখন অলস; 10 এম ফাইলের ডিরেক্টরিতে প্রথম হিট পেতে, আপনি কেবল প্রথম হিট না হওয়া পর্যন্ত কেবল স্ক্যান করেন। এমনকি প্রাক-6.6, আপনি যদি glob
কোনও ওয়াইল্ডকার্ডগুলি w / o পদ্ধতি ব্যবহার করেন তবে ফাংশনটি স্মার্ট: এটি জানে যে আপনি কেবল একটি আঘাত করতে পারেন, সুতরাং এটি গ্লোব্বিংকে কেবল os.path.isdir
বাos.path.lexists
(পথটি শেষ হয় কিনা তার উপর নির্ভর করে /
) সহজ করে তোলে ।
os.path.isdir
বা os.path.lexist
এটি পাইথন স্তরের ফাংশন কল এবং স্ট্রিংয়ের একগুচ্ছ) কার্যকর পাথ স্থির করার আগে ক্রিয়াকলাপগুলি কার্যকর, তবে কোনও অতিরিক্ত সিস্টেম কল বা আই / ও কাজ নয়, যা প্রস্থের ধীরতার আদেশ।
কোনও ফাইল উপস্থিত রয়েছে কিনা তা যাচাই করার এটি সহজতম উপায়। আপনি যাচাই করে যখন ফাইলটি বিদ্যমান ছিল কেবল তার কারণ আপনি যখন এটি খোলার দরকার হবে তখন এটি উপস্থিত থাকবে তার গ্যারান্টি দেয় না ।
import os
fname = "foo.txt"
if os.path.isfile(fname):
print("file does exist at this time")
else:
print("no such file exists at this time")
পাইথন 3.4+ এর একটি অবজেক্ট-ওরিয়েন্টেড পাথ মডিউল রয়েছে: পাথলিব । এই নতুন মডিউলটি ব্যবহার করে, আপনি পরীক্ষা করতে পারেন যে কোনও ফাইলের উপস্থিতি রয়েছে কি না:
import pathlib
p = pathlib.Path('path/to/file')
if p.is_file(): # or p.is_dir() to see if it is a directory
# do stuff
try/except
ফাইলগুলি খোলার সময় আপনি এখনও (এবং সাধারণত হওয়া উচিত) একটি ব্লক ব্যবহার করতে পারেন :
try:
with p.open() as f:
# do awesome stuff
except OSError:
print('Well darn.')
প্যাথলিব মডিউলে এতে প্রচুর শীতল জিনিস রয়েছে: সুবিধাজনক গ্লোব্বিং, ফাইলের মালিকের পরীক্ষা করা, সহজ পাথ যোগ দেওয়া ইত্যাদি checking এটি পরীক্ষা করে দেখার মতো। আপনি যদি কোনও পুরানো পাইথন (সংস্করণ ২. later বা তারপরে) থেকে থাকেন তবে আপনি এখনও পাইপ সহ পাথলিব ইনস্টল করতে পারেন:
# installs pathlib2 on older Python versions
# the original third-party module, pathlib, is no longer maintained.
pip install pathlib2
তারপরে এটিকে আমদানি করুন:
# Older Python versions
import pathlib2 as pathlib
চেষ্টা বিবৃতি পছন্দ করুন। এটিকে আরও ভাল স্টাইল হিসাবে বিবেচনা করা হয় এবং জাতিদের অবস্থা এড়ানো যায়।
আমার কথাটি এর জন্য নিবেন না। এই তত্ত্বটির জন্য প্রচুর সমর্থন রয়েছে। এখানে একটি দম্পতি:
try...except
না সাহায্যের সমাধানে যে সমস্যা যাহাই হউক না কেন।
except:
দিলে আপনার কোডের এই অংশে একটি ব্যতিক্রম একটি বিভ্রান্তিকর বার্তা উত্থাপন করবে (দ্বিতীয় ত্রুটির সময় উত্থাপিত হয়েছে) প্রথমটির প্রক্রিয়াজাতকরণ))
ট্রাই স্টেটমেন্ট ব্যবহার না করে পাইথন ব্যবহার করে কোনও ফাইল উপস্থিত রয়েছে কিনা তা আমি কীভাবে চেক করব?
পাইথন ৩.৪ থেকে এখন উপলভ্য, Path
ফাইলের নাম সহ কোনও is_file
বিষয়বস্তু আমদানি করুন এবং তা ইনস্ট্যান্ট করুন এবং পদ্ধতিটি পরীক্ষা করুন (নোট করুন যে এটি নিয়মিত ফাইলগুলিতেও নির্দেশ করে এমন সিমলিংকের ক্ষেত্রে সত্য):
>>> from pathlib import Path
>>> Path('/').is_file()
False
>>> Path('/initrd.img').is_file()
True
>>> Path('/doesnotexist').is_file()
False
আপনি যদি পাইথন 2 এ থাকেন তবে আপনি পাইপি থেকে প্যাথলিব মডিউলটি ব্যাকপোর্ট করতে পারেন pathlib2
, বা অন্যথায় মডিউলটি থেকে পরীক্ষা isfile
করতে পারেন os.path
:
>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
এখন উপরেরটি সম্ভবত এখানে সর্বোত্তম ব্যবহারিক প্রত্যক্ষ উত্তর, তবে একটি জাতি শর্তের সম্ভাবনা রয়েছে (আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে) এবং সত্য যে অন্তর্নিহিত বাস্তবায়ন একটি ব্যবহার করে try
তবে পাইথন try
তার বাস্তবায়নে সর্বত্র ব্যবহার করে ।
পাইথন যেহেতু try
সর্বত্র ব্যবহার করে তাই এটি ব্যবহার করে এমন বাস্তবায়ন এড়ানোর কোনও কারণ নেই।
তবে এই উত্তরটির বাকি অংশগুলি এই সতর্কতামূলক বিষয়গুলি বিবেচনা করার চেষ্টা করে।
পাইথন ৩.৪ থেকে পাওয়া যায়, এতে নতুন Path
বস্তুটি ব্যবহার করুন pathlib
। দ্রষ্টব্য যে .exists
একেবারেই সঠিক নয়, কারণ ডিরেক্টরিগুলি ফাইলগুলি নয় (ইউনিক্স অর্থে যে সবকিছুই একটি ফাইল।
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
সুতরাং আমাদের ব্যবহার করা প্রয়োজন is_file
:
>>> root.is_file()
False
এখানে সহায়তা দেওয়া আছে is_file
:
is_file(self)
Whether this path is a regular file (also True for symlinks pointing
to regular files).
সুতরাং আসুন যে ফাইলটি আমরা জানি একটি ফাইল এটি পাওয়া যাক:
>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
ডিফল্টরূপে, NamedTemporaryFile
ফাইলটি বন্ধ হয়ে গেলে মুছে ফেলা হয় (এবং এর সাথে আর কোনও রেফারেন্স উপস্থিত না থাকলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে)।
>>> del file
>>> filepathobj.exists()
False
>>> filepathobj.is_file()
False
আপনি যদি বাস্তবায়নটি খনন করেন তবে আপনি দেখতে পাবেন যে এটি is_file
ব্যবহার করে try
:
def is_file(self):
"""
Whether this path is a regular file (also True for symlinks pointing
to regular files).
"""
try:
return S_ISREG(self.stat().st_mode)
except OSError as e:
if e.errno not in (ENOENT, ENOTDIR):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
return False
আমরা পছন্দ করি try
কারণ এটি জাতির শর্ত এড়িয়ে চলে। এর সাহায্যে try
আপনি কেবল নিজের ফাইলটি পড়ার চেষ্টা করেছেন, এটি উপস্থিত থাকার প্রত্যাশা করে এবং যদি তা না হয় তবে আপনি ব্যতিক্রমটি ধরেন এবং যে কোনও ফলব্যাক আচরণটি বোঝায় তা সম্পাদন করে।
যদি আপনি এটি পরীক্ষা করার আগে কোনও ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে চান এবং আপনি এটি মুছে ফেলতে পারেন এবং তারপরে আপনি একাধিক থ্রেড বা প্রক্রিয়া ব্যবহার করছেন বা অন্য কোনও প্রোগ্রাম সেই ফাইলটি সম্পর্কে জানেন এবং এটি মুছে ফেলতে পারেন - আপনার সম্ভাবনা ঝুঁকিপূর্ণ একটি জাতির শর্ত যদি আপনি এটি উপস্থিত থাকে তা পরীক্ষা করেন, কারণ আপনি তার অবস্থার পরিবর্তনের আগে এটি খোলার জন্য দৌড়াদৌড়ি করছেন (এর অস্তিত্ব)।
রেস শর্তগুলি ডিবাগ করা খুব কঠিন কারণ একটি খুব ছোট উইন্ডো রয়েছে যাতে তারা আপনার প্রোগ্রামকে ব্যর্থ করতে পারে।
তবে এটি যদি আপনার প্রেরণা হয় তবে আপনি প্রসঙ্গ পরিচালককে ব্যবহার করে একটি বিবৃতিটির মান পেতে পারেন ।try
suppress
suppress
পাইথন ৩.৪ আমাদের suppress
প্রসঙ্গ ম্যানেজার দেয় (পূর্বে ignore
প্রসঙ্গ পরিচালক), যা কম লাইনে শব্দার্থগতভাবে ঠিক একই কাজ করে, যখন (অন্তত পৃষ্ঠপোষকভাবে) মূল বিবরণটি এড়াতে জিজ্ঞাসা করে try
:
from contextlib import suppress
from pathlib import Path
ব্যবহার:
>>> with suppress(OSError), Path('doesnotexist').open() as f:
... for line in f:
... print(line)
...
>>>
>>> with suppress(OSError):
... Path('doesnotexist').unlink()
...
>>>
পূর্ববর্তী পাইথনসের জন্য, আপনি নিজের রোল করতে পারেন suppress
, তবে একটি ছাড়া try
তার চেয়ে বেশি ভার্বোজ হবে। আমি বিশ্বাস করি যে এটি আসলে একমাত্র উত্তর যা try
পাইথনের কোনও স্তরে পাইথন ৩.৪ এর পূর্বে প্রয়োগ করা যেতে পারে না কারণ এটি পরিবর্তে একটি প্রসঙ্গ পরিচালক ব্যবহার করে:
class suppress(object):
def __init__(self, *exceptions):
self.exceptions = exceptions
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is not None:
return issubclass(exc_type, self.exceptions)
চেষ্টা করে খুব সহজ:
from contextlib import contextmanager
@contextmanager
def suppress(*exceptions):
try:
yield
except exceptions:
pass
isfile
import os
os.path.isfile(path)
ডক্স থেকে :
os.path.isfile(path)
পাথ যদি কোনও বিদ্যমান নিয়মিত ফাইল হয় তবে সত্যটি ফিরে যান। এই সিম্বলিক লিংক অনুসরণ করে, তাই উভয়
islink()
এবংisfile()
একই পথ জন্য সত্য হতে পারে না।
তবে আপনি যদি এই ফাংশনের উত্সটি পরীক্ষা করেন তবে আপনি দেখতে পাবেন এটি আসলে একটি ট্রায় স্টেটমেন্ট ব্যবহার করে:
# This follows symbolic links, so both islink() and isdir() can be true # for the same path on systems that support symlinks def isfile(path): """Test whether a path is a regular file""" try: st = os.stat(path) except os.error: return False return stat.S_ISREG(st.st_mode)
>>> OSError is os.error
True
এটি যা করছে তা প্রদত্ত পাথটি ব্যবহার করে এটি এটির পরিসংখ্যান পেতে পারে কিনা তা ধরছে OSError
এবং ধরা পড়ে এবং তারপরে এটি ব্যতিক্রম না বাড়িয়ে যদি কোনও ফাইল হয় কিনা তা পরীক্ষা করে।
যদি আপনি ফাইলটি দিয়ে কিছু করার ইচ্ছা করেন তবে আমি রেসের শর্ত এড়ানোর জন্য চেষ্টা করে সরাসরি চেষ্টা করার পরামর্শ দেব:
try:
with open(path) as f:
f.read()
except OSError:
pass
os.access
ইউনিক্স এবং উইন্ডোজের জন্য উপলভ্য os.access
, তবে ব্যবহার করার জন্য আপনাকে অবশ্যই পতাকা পাস করতে হবে এবং এটি ফাইল এবং ডিরেক্টরিগুলির মধ্যে পার্থক্য করে না। প্রকৃত আমন্ত্রণকারী ব্যবহারকারীর একটি উন্নত সুবিধা পরিবেশে অ্যাক্সেস আছে কিনা তা পরীক্ষার জন্য এটি আরও বেশি ব্যবহৃত হয়:
import os
os.access(path, os.F_OK)
এটি একই বর্ণের শর্তের সমস্যায়ও ভুগছে isfile
। ডক্স থেকে :
দ্রষ্টব্য: কোনও ব্যবহারকারীর উদাহরণস্বরূপ ওপেন () ব্যবহার করে কোনও ফাইল খোলার জন্য অনুমোদিত কিনা তা পরীক্ষা করতে অ্যাক্সেস () ব্যবহার করে একটি সুরক্ষা গর্ত তৈরি হয়, কারণ ব্যবহারকারীটি ফাইলটি পরীক্ষা করে দেখার জন্য এবং এটি খোলার মধ্যে স্বল্প সময়ের ব্যবধানটি ব্যবহার করতে পারে। ইএএফপি কৌশলগুলি ব্যবহার করা ভাল। উদাহরণ স্বরূপ:
if os.access("myfile", os.R_OK): with open("myfile") as fp: return fp.read() return "some default data"
আরও ভাল লিখেছেন:
try: fp = open("myfile") except IOError as e: if e.errno == errno.EACCES: return "some default data" # Not a permission error. raise else: with fp: return fp.read()
ব্যবহার এড়িয়ে চলুন os.access
। এটি নিম্ন স্তরের ফাংশন যা ব্যবহারকারীর ত্রুটির জন্য উচ্চতর স্তরের বস্তু এবং উপরে আলোচিত ফাংশনগুলির চেয়ে বেশি সুযোগ রয়েছে।
আর একটি উত্তর এ সম্পর্কে বলে os.access
:
ব্যক্তিগতভাবে, আমি এটিকে পছন্দ করি কারণ হুডের নীচে এটি নেটিভ এপিআইগুলিকে কল করে ("$ {পাইথোন এসআরসি_ডিআইআর / মডুলস / পোসিক্সডমডিউল" মাধ্যমে), তবে এটি সম্ভাব্য ব্যবহারকারীর ত্রুটির জন্য একটি গেটও খোলায় এবং এটি অন্য রূপগুলির মতো পাইথোনিকের মতো নয় :
এই উত্তরটি বলে যে এটি কোনও পাইথোনিক, ত্রুটি-প্রবণ পদ্ধতি পছন্দ করে, কোনও যুক্তি ছাড়াই। এটি ব্যবহারকারীদের বুঝতে না পেরে নিম্ন-স্তরের API ব্যবহার করতে উত্সাহিত করেছে বলে মনে হচ্ছে।
এটি একটি প্রসঙ্গ পরিচালকও তৈরি করে যা নিঃশর্তভাবে ফিরে আসার True
মাধ্যমে সমস্ত ব্যতিক্রম (সহ KeyboardInterrupt
এবং SystemExit
!) নিঃশব্দে পাস করার অনুমতি দেয় যা বাগগুলি আড়াল করার একটি ভাল উপায়।
এটি ব্যবহারকারীদের দুর্বল অভ্যাসগুলি গ্রহণ করতে উত্সাহিত করে বলে মনে হচ্ছে।
import os
#Your path here e.g. "C:\Program Files\text.txt"
#For access purposes: "C:\\Program Files\\text.txt"
if os.path.exists("C:\..."):
print "File found!"
else:
print "File not found!"
আমদানি os
আপনার অপারেটিং সিস্টেমের সাহায্যে নেভিগেট এবং স্ট্যান্ডার্ড ক্রিয়াকলাপ সম্পাদনকে সহজ করে তোলে।
রেফারেন্সের জন্য আরও দেখুন যে পাইথন ব্যবহার করে কোনও ফাইল বিদ্যমান আছে কিনা তা পরীক্ষা করে দেখুন?
আপনার যদি উচ্চ-স্তরের অপারেশনগুলির প্রয়োজন হয় তবে ব্যবহার করুন shutil
।
os.path.exists
ডিরেক্টরি নয় এমন ফাইলগুলির জন্য সত্য প্রত্যাবর্তন করে। এটি মিথ্যা ইতিবাচক দেয়। প্রস্তাবিত অন্যান্য উত্তরগুলি দেখুন os.path.isfile
।
ফাইল ও সহ ফোল্ডারের জন্য টেস্টিং os.path.isfile()
, os.path.isdir()
এবংos.path.exists()
"পথ" একটি বৈধ পথ হিসাবে ধরে নেওয়া, এই টেবিলটি ফাইল এবং ফোল্ডারগুলির জন্য প্রতিটি ফাংশন দ্বারা কী ফিরে আসে তা দেখায়:
os.path.splitext()
এক্সটেনশানটি পেতে কোনও ফাইল নির্দিষ্ট ধরণের ফাইল হয় কিনা তাও আপনি পরীক্ষা করতে পারেন (যদি আপনি ইতিমধ্যে এটি জানেন না)
>>> import os
>>> path = "path to a word document"
>>> os.path.isfile(path)
True
>>> os.path.splitext(path)[1] == ".docx" # test if the extension is .docx
True
২০১ 2016 সালে সর্বোত্তম উপায় এখনও ব্যবহার করছে os.path.isfile
:
>>> os.path.isfile('/path/to/some/file.txt')
অথবা পাইথন 3 এ আপনি ব্যবহার করতে পারেন pathlib
:
import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
...
pathlib
পাথের জন্য অজগরটির ওওপি সমাধান। আপনি এটি দিয়ে আরও অনেক কিছু করতে পারেন। আপনার যদি কেবল অস্তিত্ব পরীক্ষা করতে হয় তবে সুবিধাটি এত বড় নয়।
দেখে মনে হচ্ছে বলে মনে হচ্ছে না / চেষ্টা বাদে এবং এর মধ্যে অর্থপূর্ণ কার্যকরী পার্থক্য রয়েছে isfile()
, সুতরাং কোনটি বোঝায় তা আপনার ব্যবহার করা উচিত।
আপনি যদি কোনও ফাইল পড়তে চান তবে এটি উপস্থিত থাকলে, করুন
try:
f = open(filepath)
except IOError:
print 'Oh dear.'
তবে আপনি যদি কেবল একটি ফাইল উপস্থিত থাকলে এটির নাম পরিবর্তন করতে চান এবং তাই এটি খোলার দরকার নেই, করুন
if os.path.isfile(filepath):
os.rename(filepath, filepath + '.old')
আপনি যদি কোনও ফাইলে লিখতে চান তবে এটি উপস্থিত না থাকলে করুন do
# python 2
if not os.path.isfile(filepath):
f = open(filepath, 'w')
# python 3, x opens for exclusive creation, failing if the file already exists
try:
f = open(filepath, 'wx')
except IOError:
print 'file already exists'
আপনার যদি ফাইল লক দরকার হয় তবে এটি আলাদা বিষয় different
os.path.exists
ডিরেক্টরি নয় এমন ফাইলগুলির জন্য সত্য প্রত্যাবর্তন করে। এটি মিথ্যা ইতিবাচক দেয়। প্রস্তাবিত অন্যান্য উত্তরগুলি দেখুন os.path.isfile
।
filepath
সঠিক সময়ের সাথে নামযুক্ত একটি লিঙ্ক তৈরি করি এবং বিএএম , আপনি টার্গেট ফাইলটি ওভাররাইট করে। সমস্যাটি এড়াতে আপনার open(filepath, 'wx')
একটি try...except
ব্লকে করা উচিত ।
OSError
থাকলে একটি পাবেন filepath + '.old'
: "উইন্ডোজে, ডিএসটি ইতিমধ্যে উপস্থিত থাকলে, ওএসররার যদি একটি ফাইলও হয় তবে উত্থাপিত হবে; ডিএসটি করার সময় কোনও পারমাণবিক নাম প্রয়োগ করার উপায় নেই may একটি বিদ্যমান ফাইলের নাম দিন "
os.replace
অনুসারে গন্তব্য ফাইলটি স্থিরভাবে নীরব প্রতিস্থাপন সম্পাদন করে (এটি os.rename
লিনাক্স আচরণের সমান ) (গন্তব্যের নামটি উপস্থিত থাকলে এবং ডিরেক্টরিতে এটি কেবল ত্রুটি হয়)। সুতরাং আপনি ২.x এ আটকে গেছেন তবে পাই 3 ব্যবহারকারীরা বেশ কয়েক বছর ধরে ভাল বিকল্প পেয়েছেন।
rename
উদাহরণ: এটা এখনও সঙ্গে সম্পন্ন করতে হবে try
/ except
। os.rename
(বা os.replace
আধুনিক পাইথনের উপরে) পারমাণবিক; এটি পরীক্ষা করে পুনরায় নামকরণ করা একটি অপ্রয়োজনীয় রেস এবং অতিরিক্ত সিস্টেম কলগুলি উপস্থাপন করে। কেবলমাত্র করুনtry: os.replace(filepath, filepath + '.old') except OSError: pass
আপনি এটি চেষ্টা করতে পারেন (নিরাপদ):
try:
# http://effbot.org/zone/python-with-statement.htm
# 'with' is safer to open a file
with open('whatever.txt') as fh:
# Do something with 'fh'
except IOError as e:
print("({})".format(e))
আউটপুটটি হবে:
([এর্নো ২] এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই: 'যাইহোক। টেক্সট')
তারপরে, ফলাফলের উপর নির্ভর করে আপনার প্রোগ্রামটি সেখান থেকে চলমান রাখতে পারে বা আপনি চাইলে এটিকে থামানোর জন্য কোড করতে পারেন।
try
যদিও আমি সর্বদা ব্যবহার try
এবং except
বিবৃতি দেওয়ার পরামর্শ দিই , আপনার জন্য এখানে কয়েকটি সম্ভাবনা রয়েছে (আমার ব্যক্তিগত পছন্দ ব্যবহার করছে os.access
):
ফাইলটি খোলার চেষ্টা করুন:
ফাইলটি খোলার ফলে সর্বদা ফাইলের অস্তিত্ব যাচাই করা হবে। আপনি ঠিক তেমন একটি ফাংশন তৈরি করতে পারেন:
def File_Existence(filepath):
f = open(filepath)
return True
যদি এটি মিথ্যা হয় তবে এটি পাইথনের পরবর্তী সংস্করণগুলিতে অযথিত IOError বা OSError দিয়ে মৃত্যুদন্ড কার্যকর করবে। ব্যতিক্রমটি ধরতে, আপনাকে ক্লজটি বাদ দিয়ে চেষ্টা করতে হবে। অবশ্যই, আপনি সর্বদা এই জাতীয় একটি try
বিবৃতি ব্যবহার করতে পারেন (
আমাকে ভাবিয়ে তোলার জন্য এইচএস্যান্ড্টকে ধন্যবাদ ):
def File_Existence(filepath):
try:
f = open(filepath)
except IOError, OSError: # Note OSError is for later versions of Python
return False
return True
ব্যবহার os.path.exists(path)
:
এটি আপনার নির্দিষ্টকরণের অস্তিত্ব পরীক্ষা করবে। তবে এটি ফাইল এবং ডিরেক্টরিগুলির জন্য পরীক্ষা করে তাই আপনি কীভাবে এটি ব্যবহার করেন সে সম্পর্কে সতর্ক হন।
import os.path
>>> os.path.exists("this/is/a/directory")
True
>>> os.path.exists("this/is/a/file.txt")
True
>>> os.path.exists("not/a/directory")
False
ব্যবহার os.access(path, mode)
:
এটি আপনার ফাইলটিতে অ্যাক্সেস আছে কিনা তা যাচাই করবে। এটি অনুমতিগুলির জন্য পরীক্ষা করবে। Os.py ডকুমেন্টেশনের উপর ভিত্তি করে টাইপ করে os.F_OK
এটি পথের অস্তিত্ব পরীক্ষা করবে। তবে এটি ব্যবহার করা একটি সুরক্ষা গর্ত তৈরি করবে, কারণ অনুমতিগুলি যাচাই করা এবং ফাইলটি খোলার মধ্যে সময় ব্যবহার করে কেউ আপনার ফাইলটিতে আক্রমণ করতে পারে। পরিবর্তে ফাইলের অনুমতিগুলি পরীক্ষা করার পরিবর্তে আপনার সরাসরি ফাইলটি খোলার উচিত। ( EAFP বনাম LBYP )। আপনি যদি পরে ফাইলটি খুলতে যাচ্ছেন না এবং কেবল এর অস্তিত্ব পরীক্ষা করছেন, তবে আপনি এটি ব্যবহার করতে পারেন।
যাইহোক, এখানে:
>>> import os
>>> os.access("/is/a/file.txt", os.F_OK)
True
আমার আরও উল্লেখ করা উচিত যে দুটি উপায় রয়েছে যা আপনি কোনও ফাইলের অস্তিত্ব যাচাই করতে সক্ষম হবেন না। হয় বিষয়টি হবে permission denied
বা no such file or directory
। আপনি যদি একটি ধরেন তবে IOError
সেট করুন IOError as e
(আমার প্রথম বিকল্পের মতো) এবং তারপরে টাইপ করুন print(e.args)
যাতে আপনি আশাবাদী আপনার সমস্যাটি নির্ধারণ করতে পারেন। আমি আসা করি এটা সাহায্য করবে! :)
তারিখ: 2017-12-04
প্রতিটি সম্ভাব্য সমাধান অন্যান্য উত্তরে তালিকাভুক্ত করা হয়েছে।
একটি ফাইল বিদ্যমান কিনা তা যাচাই করার একটি স্বজ্ঞাত এবং তর্কযোগ্য উপায় নিম্নলিখিত:
import os
os.path.isfile('~/file.md') # Returns True if exists, else False
# additionaly check a dir
os.path.isdir('~/folder') # Returns True if the folder exists, else False
# check either a dir or a file
os.path.exists('~/file')
আপনার রেফারেন্সের জন্য আমি একটি বিস্ময়কর চিটশিট তৈরি করেছি:
#os.path methods in exhaustive cheatsheet
{'definition': ['dirname',
'basename',
'abspath',
'relpath',
'commonpath',
'normpath',
'realpath'],
'operation': ['split', 'splitdrive', 'splitext',
'join', 'normcase'],
'compare': ['samefile', 'sameopenfile', 'samestat'],
'condition': ['isdir',
'isfile',
'exists',
'lexists'
'islink',
'isabs',
'ismount',],
'expand': ['expanduser',
'expandvars'],
'stat': ['getatime', 'getctime', 'getmtime',
'getsize']}
ফাইলটি খোলার জন্য হলে আপনি নিম্নলিখিত কৌশলগুলির মধ্যে একটি ব্যবহার করতে পারেন:
with open('somefile', 'xt') as f: #Using the x-flag, Python3.3 and above
f.write('Hello\n')
if not os.path.exists('somefile'):
with open('somefile', 'wt') as f:
f.write("Hello\n")
else:
print('File already exists!')
হালনাগাদ
কেবল বিভ্রান্তি এড়াতে এবং আমি যে উত্তর পেয়েছি তার উপর ভিত্তি করে, বর্তমান উত্তরগুলি প্রদত্ত নামের একটি ফাইল বা ডিরেক্টরি খুঁজে পাবে ।
os.path.exists
ডিরেক্টরি নয় এমন ফাইলগুলির জন্য সত্য প্রত্যাবর্তন করে। এটি মিথ্যা ইতিবাচক দেয়। প্রস্তাবিত অন্যান্য উত্তরগুলি দেখুন os.path.isfile
।
if os.path.isfile(path_to_file):
try:
open(path_to_file)
pass
except IOError as e:
print "Unable to open file"
ব্যতিক্রম উত্থাপনকে আপনার প্রোগ্রামে প্রবাহ নিয়ন্ত্রণের জন্য গ্রহণযোগ্য এবং পাইথোনিক হিসাবে বিবেচনা করা হয়। আইওএরফের সাহায্যে অনুপস্থিত ফাইলগুলি পরিচালনা করার বিষয়টি বিবেচনা করুন। এই পরিস্থিতিতে, যদি ফাইল বিদ্যমান থাকে তবে ব্যবহারকারীর পড়ার অনুমতি না থাকলে একটি আইওআরর ব্যতিক্রম উত্থাপিত হবে।
এসআরসি: http://www.pfinn.net/python-check-if-file-exists.html
আপনি ছাড়া ব্রায়ানের পরামর্শ লিখতে পারেন try:
।
from contextlib import suppress
with suppress(IOError), open('filename'):
process()
suppress
পাইথনের ৩.৪ অংশ। পুরানো প্রকাশে আপনি দ্রুত নিজের দমন লিখতে পারেন:
from contextlib import contextmanager
@contextmanager
def suppress(*exceptions):
try:
yield
except exceptions:
pass
আমি একটি প্যাকেজটির লেখক যা প্রায় 10 বছর ধরে ছিল এবং এর একটি ফাংশন রয়েছে যা এই প্রশ্নটিকে সরাসরি সম্বোধন করে। মূলত, আপনি যদি উইন্ডোজবিহীন সিস্টেমে থাকেন তবে এটি Popen
অ্যাক্সেসের জন্য ব্যবহার করে find
। তবে আপনি যদি উইন্ডোজটিতে থাকেন তবে এটি find
একটি দক্ষ ফাইল সিস্টেম ওয়াকারের সাথে প্রতিরূপ তৈরি করে।
কোড নিজেই কোনও try
ব্লক ব্যবহার করে না ... অপারেটিং সিস্টেমটি নির্ধারণ করা এবং এভাবে আপনাকে "ইউনিক্স" find
-স্টাইল বা হ্যান্ড-বিল্টে চালিত করা ছাড়া find
। সময় পরীক্ষার try
মাধ্যমে ওএস নির্ধারণে ত্বরান্বিত হয়েছে, তাই আমি সেখানে একটি ব্যবহার করেছি (তবে অন্য কোথাও নেই)।
>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']
এবং ডক ...
>>> print pox.find.__doc__
find(patterns[,root,recurse,type]); Get path to a file or directory
patterns: name or partial name string of items to search for
root: path string of top-level directory to search
recurse: if True, recurse down from root directory
type: item filter; one of {None, file, dir, link, socket, block, char}
verbose: if True, be a little verbose about the search
On some OS, recursion can be specified by recursion depth (an integer).
patterns can be specified with basic pattern matching. Additionally,
multiple patterns can be specified by splitting patterns with a ';'
For example:
>>> find('pox*', root='..')
['/Users/foo/pox/pox', '/Users/foo/pox/scripts/pox_launcher.py']
>>> find('*shutils*;*init*')
['/Users/foo/pox/pox/shutils.py', '/Users/foo/pox/pox/__init__.py']
>>>
আপনি যদি নজরদারি করেন তবে বাস্তবায়নটি এখানে রয়েছে: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89 داد9 / pox / shutils.py#L190
আপনি এই তিনটি উপায় অনুসরণ করতে পারেন:
নোট 1:
os.path.isfile
শুধুমাত্র ফাইলের জন্য ব্যবহৃত
import os.path
os.path.isfile(filename) # True if file exists
os.path.isfile(dirname) # False if directory exists
নোট 2:
os.path.exists
ফাইল এবং ডিরেক্টরি উভয়ের জন্য ব্যবহৃত
import os.path
os.path.exists(filename) # True if file exists
os.path.exists(dirname) #True if directory exists
pathlib.Path
পদ্ধতি (পাইথন অন্তর্ভুক্ত 3+, পাইথন 2 জন্য PIP এর সাথে ইনস্টলযোগ্য)
from pathlib import Path
Path(filename).exists()
আরও একটি সামান্য প্রকরণ যোগ করা যা অন্য উত্তরে হুবহু প্রতিফলিত হয় না।
এটি file_path
সত্তা None
বা খালি স্ট্রিংয়ের ক্ষেত্রে পরিচালনা করবে ।
def file_exists(file_path):
if not file_path:
return False
elif not os.path.isfile(file_path):
return False
else:
return True
শাহবাজের পরামর্শের ভিত্তিতে একটি বৈকল্পিক যুক্ত করা হচ্ছে
def file_exists(file_path):
if not file_path:
return False
else:
return os.path.isfile(file_path)
পিটার উডের পরামর্শের ভিত্তিতে একটি বৈকল্পিক যুক্ত করা
def file_exists(file_path):
return file_path and os.path.isfile(file_path):
if (x) return true; else return false;
সত্যিই ঠিক return x
। আপনার শেষ চারটি লাইন হয়ে উঠতে পারে return os.path.isfile(file_path)
। আমরা যখন এটিতে থাকি তখন পুরো ফাংশনটিকে সরলীকৃত করা যায় return file_path and os.path.isfile(file_path)
।
return x
ক্ষেত্রে আপনাকে যত্নবান হতে হবে if (x)
। পাইথন একটি খালি স্ট্রিং ভুয়া বিবেচনা করবে সেই ক্ষেত্রে আমরা বুলের পরিবর্তে খালি স্ট্রিংটি ফিরিয়ে আনব। এই ফাংশনটির উদ্দেশ্য হ'ল সর্বদা ফিরে আসুন।
x
হয় os.path.isfile(..)
তাই এটি ইতিমধ্যে bool হচ্ছে।
os.path.isfile(None)
একটি ব্যতিক্রম উত্থাপন করে যার কারণে আমি যদি চেকটি যুক্ত করেছি। আমি সম্ভবত এটির পরিবর্তে ব্যতীত কেবল একটি চেষ্টা করে গুটিয়ে রাখতে পারি তবে আমি অনুভব করেছি যে এটি এটি আরও স্পষ্ট।
return file_path and os.path.isfile(file_path)
লিনাক্স কমান্ড লাইন পরিবেশের জন্য এখানে একটি 1 লাইন পাইথন কমান্ড। আমি এই খুব হ্যান্ডি পাই যেহেতু আমি এত গরম বাশ লোক নই।
python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"
আমি আশা করি এই সহায়ক।
[ -f "${file}" ] && echo "file found" || echo "file not found"
(যা একইরকম if [ ... ]; then ...; else ...; fi
)।
আপনি পাইথনের "ওএস" গ্রন্থাগারটি ব্যবহার করতে পারেন:
>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt")
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
os.path.exists
ডিরেক্টরি নয় এমন ফাইলগুলির জন্য সত্য প্রত্যাবর্তন করে। এটি মিথ্যা ইতিবাচক দেয়। প্রস্তাবিত অন্যান্য উত্তরগুলি দেখুন os.path.isfile
।
exists
তা ঠিক আছে। যদি লক্ষ্যটি নির্ধারণ করা হয় যে সম্ভবত এটি বিদ্যমান ফাইলটি খোলার পক্ষে নিরাপদ কিনা, তবে সমালোচনা ন্যায়সঙ্গত এবং উপস্থিত রয়েছে যা যথেষ্ট সুনির্দিষ্ট নয়। দুঃখের বিষয়, ওপি নির্দিষ্ট করে না কোনটি পছন্দসই লক্ষ্য (এবং সম্ভবত আর কোনও কাজ করবে না)।
ট্রাই স্টেটমেন্ট ব্যবহার না করে কোনও ফাইল উপস্থিত রয়েছে কিনা তা আমি কীভাবে চেক করব?
২০১ In সালে, এটি এখনও উভয়ই ফাইল উপস্থিত রয়েছে কিনা তা যাচাই করার সবচেয়ে সহজ উপায় এবং এটি যদি কোনও ফাইল হয়:
import os
os.path.isfile('./file.txt') # Returns True if exists, else False
isfile
প্রকৃতপক্ষে কেবলমাত্র একটি সহায়ক পদ্ধতি যা অভ্যন্তরীণভাবে ব্যবহার করে os.stat
এবং stat.S_ISREG(mode)
নীচে। এটি os.stat
একটি নিম্ন-স্তরের পদ্ধতি যা আপনাকে ফাইল, ডিরেক্টরি, সকেট, বাফার এবং আরও অনেক কিছু সম্পর্কে বিশদ তথ্য সরবরাহ করবে। Os.stat সম্পর্কে আরও এখানে
দ্রষ্টব্য: তবে, এই পদ্ধতির ফলে কোনওভাবেই ফাইলটি লক হবে না এবং তাই আপনার কোডটি " ব্যবহারের সময় যাচাইয়ের সময় " ( ট্যাকটিউইউ ) বাগগুলির জন্য ঝুঁকির মধ্যে পড়ে ।
সুতরাং ব্যতিক্রম উত্থাপনকে আপনার প্রোগ্রামে প্রবাহ নিয়ন্ত্রণের জন্য গ্রহণযোগ্য এবং পাইথোনিক হিসাবে বিবেচনা করা হয়। এবং আইওআরফের সাথে নিখোঁজ ফাইলগুলি হ্যান্ডলিংয়ের কথা বিবেচনা করা উচিত, if
বিবৃতিগুলির চেয়ে ( কেবলমাত্র একটি পরামর্শ )।
import os.path
def isReadableFile(file_path, file_name):
full_path = file_path + "/" + file_name
try:
if not os.path.exists(file_path):
print "File path is invalid."
return False
elif not os.path.isfile(full_path):
print "File does not exist."
return False
elif not os.access(full_path, os.R_OK):
print "File cannot be read."
return False
else:
print "File can be read."
return True
except IOError as ex:
print "I/O error({0}): {1}".format(ex.errno, ex.strerror)
except Error as ex:
print "Error({0}): {1}".format(ex.errno, ex.strerror)
return False
#------------------------------------------------------
path = "/usr/khaled/documents/puzzles"
fileName = "puzzle_1.txt"
isReadableFile(path, fileName)
isReadableFile(path,fileName)
True