मैं try
बयान का उपयोग किए बिना कैसे जांच सकता हूं कि कोई फ़ाइल मौजूद है या नहीं ?
मैं try
बयान का उपयोग किए बिना कैसे जांच सकता हूं कि कोई फ़ाइल मौजूद है या नहीं ?
जवाबों:
यदि आप जिस कारण की जांच कर रहे हैं if file_exists: open_it()
, वह ऐसा है जैसे आप कुछ कर सकते हैं , तो इसे try
खोलने के प्रयास के आसपास उपयोग करना सुरक्षित है। जब आप जाँच करते हैं और जब आप इसे खोलने का प्रयास करते हैं, तो चेक करना और फिर फ़ाइल को डिलीट या स्थानांतरित या कुछ के बीच खोलना।
यदि आप फ़ाइल को तुरंत खोलने की योजना नहीं बना रहे हैं, तो आप उपयोग कर सकते हैं os.path.isfile
True
यदि पथ मौजूदा नियमित फ़ाइल है, तो वापस लौटें । यह प्रतीकात्मक लिंक का अनुसरण करता है, इसलिए दोनों islink () और isfile () दोनों एक ही पथ के लिए सही हो सकते हैं।
import os.path
os.path.isfile(fname)
यदि आपको यह सुनिश्चित करने की आवश्यकता है कि यह एक फाइल है।
पायथन 3.4 के साथ शुरू, pathlib
मॉड्यूल एक वस्तु-उन्मुख दृष्टिकोण ( pathlib2
पायथन 2.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)
परीक्षण करने के लिए कि क्या यह विशेष रूप से एक फ़ाइल है। यह सहजीवन का अनुसरण करता है।
इसके विपरीत isfile()
, निर्देशिका के लिए exists()
वापस आ जाएगा True
। तो अगर आप केवल सादे फ़ाइलें या निर्देशिका भी चाहते हैं पर निर्भर करता है, तो आप उपयोग करेंगे isfile()
या exists()
। यहाँ कुछ सरल REPL आउटपुट है:
>>> 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.4 ) में लगभग हर संभव तरीके को (कम से कम एक) सूचीबद्ध किया गया है विशिष्ट सामान जोड़ा गया था), मैं सब कुछ एक साथ करने की कोशिश करूंगा।
नोट : पायथन मानक पुस्तकालय कोड का हर टुकड़ा, जो मैं पोस्ट करने जा रहा हूं, 3.5.3 संस्करण के अंतर्गत आता है ।
समस्या कथन :
संभावित समाधान :
[पायथन 3]: os.path मौजूद है ( पथ ) (यह भी जैसे अन्य समारोह परिवार के सदस्यों की जांच os.path.isfile
, os.path.isdir
, os.path.lexists
थोड़ा अलग व्यवहार के लिए)
os.path.exists(path)
True
यदि पथ मौजूदा पथ या एक खुले फ़ाइल डिस्क्रिप्टर को संदर्भित करता है तो वापस लौटें ।False
टूटे हुए प्रतीकात्मक लिंक के लिए रिटर्न । कुछ प्लेटफार्मों पर, इस समारोह वापस आ सकते हैंFalse
यदि अनुमति निष्पादित करने के लिए दी गई नहीं है () os.stat अनुरोध की गई फ़ाइल पर, भले ही पथ शारीरिक रूप से मौजूद है।
सभी अच्छे हैं, लेकिन अगर आयात पेड़ का पालन करें:
os.path
- posixpath.py ( ntpath.py )
genericpath.py , line ~ # 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 = कोई नहीं, follow_symlinks = True ) । तो, आपका कोड मुफ्त में छोड़कर / कोशिश कर रहा है , लेकिन फ्रैमेस्टैक में कम है (कम से कम) एक ऐसा ब्लॉक। यह अन्य फ़न ( सहित ) पर भी लागू होता है । os.path.isfile
हुड के तहत, यह बिल्कुल वैसा ही काम करता है ( pathlib.py , line ~ # 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
[पायथन ३]: स्टेटमेंट कॉन्टेक्स्ट मैनेजर्स के साथ । कोई एक:
एक बनाए:
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]: स्टेटमेंट स्टेट्स के साथ :
यह सामान्य प्रयास की अनुमति देता है ... सिवाय ... अंत में उपयोग के पैटर्न को सुविधाजनक पुन: उपयोग के लिए समझाया जा सकता है।
फाइलसिस्टम ट्रैवर्सल फ़ंक्शन (और मिलान आइटम के लिए परिणाम खोजें)
[अजगर 3]: ओएस। listdir ( पथ = '।' ) (या [अजगर 3]:। ओएस scandir ( '।' पथ = ) पर पायथन v 3.5 +, backport: [PyPI]: scandir )
हुड के तहत, दोनों का उपयोग करें:
के माध्यम से [GitHub]: अजगर / cpython - (मास्टर) cpython / मॉड्यूल / posixmodule.c
का उपयोग करते हुए scandir () के बजाय listdir () भी महत्वपूर्ण है, कोड है कि यह भी फ़ाइल प्रकार या फ़ाइल विशेषता जानकारी की जरूरत के प्रदर्शन को बेहतर कर सकते हैं क्योंकि os.DirEntry वस्तुओं इस जानकारी का खुलासा जब एक निर्देशिका स्कैन करता है, तो ऑपरेटिंग सिस्टम यह प्रदान करता है। सभी os.DirEntry विधियाँ एक सिस्टम कॉल कर सकती हैं, लेकिन is_dir () और is_file () में आमतौर पर केवल प्रतीकात्मक लिंक के लिए सिस्टम कॉल की आवश्यकता होती है; os.DirEntry.stat () को हमेशा यूनिक्स पर एक सिस्टम कॉल की आवश्यकता होती है, लेकिन केवल विंडोज पर प्रतीकात्मक लिंक के लिए एक की आवश्यकता होती है।
os.listdir
( os.scandir
जब उपलब्ध हो) का उपयोग करता हैglob.glob
)
os.listdir
चूँकि इन फोल्डर पर (ज्यादातर मामलों में) वे हमारी समस्या के लिए अक्षम हैं (अपवाद हैं, जैसे नॉन वाइल्डकार्ड ग्लोब बिंग - जैसा कि @ शादो रेंजर ने बताया), इसलिए मैं उनके लिए जोर नहीं दे रहा हूं। यह उल्लेख नहीं करने के लिए कि कुछ मामलों में, फ़ाइल नाम प्रसंस्करण की आवश्यकता हो सकती है।
[अजगर 3]: ओएस। पहुंच ( पथ, मोड, *, dir_fd = कोई नहीं, प्रभावी_की = गलत, अनुसरण_समूह = सत्य ) जिसका व्यवहार करीब है os.path.exists
(वास्तव में यह व्यापक है, मुख्यतः 2 एन डी तर्क के कारण)
... परीक्षण करें कि क्या आह्वान करने वाले उपयोगकर्ता के पास पथ तक निर्दिष्ट पहुंच है । मार्ग के अस्तित्व का परीक्षण करने के लिए मोड F_OK होना चाहिए ...
os.access("/tmp", os.F_OK)
चूंकि मैं सी में भी काम करता हूं, इसलिए मैं इस पद्धति का उपयोग करता हूं क्योंकि हुड के तहत, यह मूल एपीआई एस (फिर से, "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" ) के माध्यम से कॉल करता है , लेकिन यह संभावित उपयोगकर्ता के लिए एक गेट भी खोलता है । त्रुटियों , और यह अन्य वेरिएंट की तरह पायथन आईसी नहीं है । इसलिए, @AaronHall ने ठीक ही बताया, जब तक आप जानते हैं कि आप क्या कर रहे हैं, इसका उपयोग न करें:
नोट : देशी एपीआई को कॉल करना भी संभव है [अजगर 3] के माध्यम से : ctypes - पायथन के लिए एक विदेशी फ़ंक्शन लाइब्रेरी , लेकिन ज्यादातर मामलों में यह अधिक जटिल है।
( विन विशिष्ट): चूंकि 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 64) ) समकक्ष के रूप में अच्छी तरह से:
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
नोट :
इसके बजाय हार्डकोड libc के पथ ( "/lib/x86_64-linux-gnu/libc.so.6" ), जो हो सकता है (और सबसे अधिक संभावना, होगी) प्रणाली, में अलग अलग से कोई भी (या खाली स्ट्रिंग) पर पारित किया जा सकता CDLL निर्माता ( ctypes.CDLL(None).access(b"/tmp", os.F_OK)
)। [Man7] के अनुसार : DLOPEN (3) :
यदि फ़ाइल नाम NULL है, तो मुख्य प्रोग्राम के लिए दिया गया हैंडल है। जब dlsym () को दिया जाता है , तो यह हैंडल मुख्य प्रोग्राम में प्रतीक के लिए खोज का कारण बनता है, उसके बाद प्रोग्राम स्टार्टअप पर लोड की गई सभी साझा ऑब्जेक्ट्स, और फिर फ्लैग RTLD_GLOBAL के साथ dlopen () द्वारा लोड की गई सभी साझा ऑब्जेक्ट्स ।
__declspec(dllexport)
(क्यों पृथ्वी पर नियमित व्यक्ति ऐसा करेगा?), मुख्य कार्यक्रम लोड करने योग्य है, लेकिन बहुत अधिक अनुपयोगी हैफ़ाइल सिस्टम क्षमताओं के साथ कुछ तृतीय-पक्ष मॉड्यूल स्थापित करें
सबसे अधिक संभावना है, ऊपर दिए गए तरीकों में से एक पर भरोसा करेगा (शायद मामूली अनुकूलन के साथ)।
एक उदाहरण होगा (फिर से, जीत विशिष्ट) [GitHub]: mhammond / pywin32 - अजगर विंडोज (pywin32) एक्सटेंशन के लिए है, जो एक है अजगर के ऊपर आवरण WINAPI रों।
लेकिन, चूंकि यह एक वर्कअराउंड की तरह अधिक है, मैं यहां रोक रहा हूं।
एक और (लंगड़ा) वर्कअराउंड ( गेनरी ) है (जैसा कि मैं इसे कॉल करना पसंद करता हूं), 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
, इसलिए यह अब आलसी है; 10M फ़ाइलों की निर्देशिका में पहली हिट पाने के लिए, आप केवल तब तक स्कैन करते हैं जब तक आप पहली हिट तक नहीं पहुंच जाते। और यहां तक कि प्री-3.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+ में ऑब्जेक्ट-ओरिएंटेड पथ मॉड्यूल है: pathlib । इस नए मॉड्यूल का उपयोग करके, आप जांच सकते हैं कि क्या कोई फाइल इस तरह मौजूद है:
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.')
पाथलिब मॉड्यूल में बहुत सारी सामग्री होती है: सुविधाजनक ग्लोबिंग, फ़ाइल के मालिक की जाँच करना, आसान रास्ते से जुड़ना, इत्यादि। यदि आप एक पुराने पायथन (संस्करण 2.6 या बाद के संस्करण) पर हैं, तो आप अभी भी पाइप के साथ पाथलिब स्थापित कर सकते हैं:
# 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:
क्लॉज़ में डालने से यह होगा कि आपके कोड के इस हिस्से में उत्पन्न होने वाला एक अपवाद एक भ्रामक संदेश देगा (दूसरी त्रुटि के दौरान उठाया गया) पहले एक का प्रसंस्करण।)
मैं यह कैसे जाँच सकता हूँ कि क्या कोई फ़ाइल मौजूद है, कोशिश बयान का उपयोग किए बिना पायथन का उपयोग करके?
अब पायथन 3.4 के बाद से उपलब्ध है, 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
हर जगह उपयोग करता है, वास्तव में इसे लागू करने से बचने का कोई कारण नहीं है।
लेकिन इस उत्तर के बाकी हिस्सों में इन गुहाओं पर विचार करने का प्रयास किया गया है।
पायथन 3.4 के बाद से उपलब्ध, में नई 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
पायथॉन 3.4 हमें 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
पायथन में किसी भी स्तर पर उपयोग नहीं करता है जो कि पायथन 3.4 से पहले लागू किया जा सकता है क्योंकि यह इसके बजाय संदर्भ प्रबंधक का उपयोग करता है:
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
:
व्यक्तिगत रूप से, मैं इसे पसंद करता हूं क्योंकि हुड के तहत, यह देशी एपीआई ("$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" के माध्यम से) को कॉल करता है, लेकिन यह संभावित संभावित त्रुटियों के लिए एक गेट भी खोलता है, और यह अन्य वेरिएंट के रूप में पायथोनिक नहीं है। :
यह उत्तर कहता है कि यह गैर-पायथन, त्रुटि-प्रवण पद्धति को प्राथमिकता देता है, जिसमें कोई औचित्य नहीं है। यह उपयोगकर्ताओं को बिना समझे निम्न स्तर के एपीआई का उपयोग करने के लिए प्रोत्साहित करता है।
यह एक संदर्भ प्रबंधक भी बनाता है, जो बिना शर्त वापस लौटकर 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')
यदि आप किसी फ़ाइल पर लिखना चाहते हैं, यदि वह मौजूद नहीं है, तो करें
# 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'
यदि आपको फ़ाइल लॉकिंग की आवश्यकता है, तो यह एक अलग मामला है।
os.path.exists
उन चीज़ों के लिए सही है जो फाइलें नहीं हैं, जैसे निर्देशिका। इससे झूठी सकारात्मकता मिलती है। सलाह देने वाले अन्य उत्तर देखें os.path.isfile
।
filepath
सही समय के साथ एक लिंक बनाता हूं , और BAM , आप लक्ष्य फ़ाइल को अधिलेखित कर देते हैं। आपको समस्या से बचने के लिए ब्लॉक open(filepath, 'wx')
में करना चाहिए try...except
।
OSError
, तो filepath + '.old'
पहले से मौजूद है: "Windows पर, अगर डीएसटी पहले से मौजूद है, OSError बढ़ा दी जाएगी, भले ही यह एक फ़ाइल है, एक परमाणु नाम बदलने जब डीएसटी लागू करने के लिए कोई रास्ता नहीं हो सकता है एक मौजूदा फ़ाइल का नाम। "
os.replace
गंतव्य फ़ाइल के चुप प्रतिस्थापन को प्रदर्शित करता है (यह os.rename
's Linux व्यवहार के समान है ) (यह केवल त्रुटी है यदि गंतव्य का नाम मौजूद है और एक निर्देशिका है)। तो आप 2.x पर अटक गए हैं, लेकिन Py3 उपयोगकर्ताओं के पास कई वर्षों से एक अच्छा विकल्प है।
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))
निम्न होगा:
((Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'जो भी हो')
फिर, परिणाम के आधार पर, आपका कार्यक्रम बस वहां से चालू रह सकता है या आप चाहें तो इसे रोकने के लिए कोड कर सकते हैं।
try
हालांकि मैं हमेशा उपयोग करने try
और except
बयान देने की सलाह देता हूं , यहां आपके लिए कुछ संभावनाएं हैं (मेरा निजी पसंदीदा उपयोग कर रहा है os.access
):
फ़ाइल खोलने का प्रयास करें:
फ़ाइल खोलना हमेशा फ़ाइल के अस्तित्व को सत्यापित करेगा। आप ऐसा ही एक समारोह कर सकते हैं:
def File_Existence(filepath):
f = open(filepath)
return True
यदि यह गलत है, तो यह पायथन के बाद के संस्करणों में एक अनधिकृत IOError या OSError के साथ निष्पादन को रोक देगा। अपवाद को पकड़ने के लिए, आपको क्लॉज को छोड़कर एक कोशिश का उपयोग करना होगा। बेशक, आप हमेशा एक try
अपवाद का उपयोग कर सकते हैं जैसे कि (
मुझे सोचने के लिए hsandt के लिए धन्यवाद ):
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.F_OK
, यह पथ के अस्तित्व की जांच करेगा। हालाँकि, इसका उपयोग करने से एक सुरक्षा छेद बन जाएगा, क्योंकि अनुमतियाँ जाँचने और फ़ाइल खोलने के बीच के समय का उपयोग करके कोई आपकी फ़ाइल पर हमला कर सकता है। आपको इसकी अनुमतियों की जांच करने के बजाय सीधे फ़ाइल खोलने के लिए जाना चाहिए। ( ईएएफपी बनाम एलबीवाईपी )। यदि आप बाद में फ़ाइल को खोलने नहीं जा रहे हैं, और केवल इसके अस्तित्व की जाँच कर रहे हैं, तो आप इसका उपयोग कर सकते हैं।
वैसे भी, यहाँ:
>>> 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"
अपवादों को उठाना एक स्वीकार्य और पायथोनिक माना जाता है, आपके कार्यक्रम में प्रवाह नियंत्रण के लिए दृष्टिकोण। IOErrors के साथ लापता फ़ाइलों को संभालने पर विचार करें। इस स्थिति में, एक IOError अपवाद उठाया जाएगा यदि फ़ाइल मौजूद है, लेकिन उपयोगकर्ता के पास पढ़ने की अनुमति नहीं है।
आप ब्रायन के सुझाव को बिना लिखे लिख सकते हैं try:
।
from contextlib import suppress
with suppress(IOError), open('filename'):
process()
suppress
पायथन 3.4 का हिस्सा है। पुराने रिलीज में आप जल्दी से अपने स्वयं के दमन लिख सकते हैं:
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/89f90fb308f285ca7a62eabe2c38acb87e89dad9/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
Note2:
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 के लिए पिप के साथ स्थापित करने योग्य)
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
)।
आप पायथन के "OS" पुस्तकालय का उपयोग कर सकते हैं:
>>> 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
ठीक है। यदि लक्ष्य यह निर्धारित करना है कि क्या यह संभवतया मौजूदा फ़ाइल खोलने के लिए सुरक्षित है, तो आलोचना उचित है और मौजूद पर्याप्त सटीक नहीं है। अफसोस की बात है, ओपी निर्दिष्ट नहीं करता है कि वांछित लक्ष्य क्या है (और शायद ऐसा कोई और नहीं करेगा)।
मैं कैसे जांच करूं कि कोई फ़ाइल मौजूद है, बिना कोशिश के बयान का उपयोग करते हुए?
2016 में, यह निश्चित रूप से यह जांचने का सबसे आसान तरीका है कि क्या कोई फ़ाइल मौजूद है और यदि यह एक फ़ाइल है:
import os
os.path.isfile('./file.txt') # Returns True if exists, else False
isfile
वास्तव में सिर्फ एक सहायक विधि है जो आंतरिक रूप से उपयोग os.stat
और stat.S_ISREG(mode)
नीचे है। यह os.stat
एक निम्न-स्तरीय विधि है जो आपको फ़ाइलों, निर्देशिकाओं, सॉकेट्स, बफ़र्स और अधिक के बारे में विस्तृत जानकारी प्रदान करेगी। यहाँ os.stat के बारे में अधिक
नोट: हालांकि, यह दृष्टिकोण किसी भी तरह से फ़ाइल को लॉक नहीं करेगा और इसलिए आपका कोड "उपयोग के समय की जांच के समय " ( TOCTTOU ) के लिए असुरक्षित हो सकता है ) बग के ।
इसलिए अपवादों को उठाना एक स्वीकार्य और पाइथोनिक माना जाता है, आपके कार्यक्रम में प्रवाह नियंत्रण के लिए दृष्टिकोण। और किसी को if
बयानों ( केवल एक सलाह ) के बजाय IOErrors के साथ लापता फ़ाइलों को संभालने पर विचार करना चाहिए ।
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
अगर फाइल \ धागा पहुंचा जा सकता है और इस प्रक्रिया \ प्रोग्राम द्वारा पढ़ी जा सकती है