मैं यह कैसे जांच सकता हूं कि कोई फ़ाइल अपवाद के बिना मौजूद है या नहीं?


5600

मैं tryबयान का उपयोग किए बिना कैसे जांच सकता हूं कि कोई फ़ाइल मौजूद है या नहीं ?


2
ऐसा प्रतीत होता है कि शास्त्रीय ईएएफपी बनाम एलबीवाईएल चर्चा है, उदाहरण के लिए देखें यह संबंधित प्रश्न: stackoverflow.com/questions/1835756/use-try-vs-if-in-python
Matth

यह भी प्रासंगिक है यदि आप जानना चाहते हैं कि क्या यह डिस्क पर मौजूद है (या तो सीधे या एक प्रतीकात्मक लिंक के रूप में), यदि आप इसे पढ़ सकते हैं, या यदि आप इसे लिख सकते हैं।
थोरबजोरन रावन एंडरसन

जवाबों:


5150

यदि आप जिस कारण की जांच कर रहे हैं 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

40
पहली टिप्पणी के विषय में (उपयोग "कोशिश" अगर खुले से पहले जाँच करें) दुर्भाग्य से यह काम नहीं करेगा यदि आप यह सुनिश्चित करने के लिए खोलना चाहते हैं कि यह मौजूद है क्योंकि 'ए' मोड पहले से मौजूद है अगर मौजूद नहीं है।
मकाफ

6
नोट जो FileNotFoundErrorपायथन 3 में पेश किया गया था। यदि आपको भी पायथन 2.7 के साथ-साथ पायथन 3 का भी समर्थन करने की आवश्यकता है, तो आप IOErrorइसके बजाय (जो FileNotFoundErrorउपवर्ग) stackoverflow.com/a/21368457/1960959
scclclowe

7
@makapuf आप इसे "अपडेट" ( open('file', 'r+')) के लिए खोल सकते हैं और फिर समाप्ति की तलाश कर सकते हैं।
कीरिल

2
@kyrill ओपन-एंड-सीक-टू-एंड, ओपन-फॉर-एपेंड (कम से कम पॉज़िक्स सिस्टम पर) के समान नहीं है। "एपेंड मोड" हमेशा फ़ाइल के अंत में सही ढंग से लिखेगा, भले ही अन्य चीजें फ़ाइल को तब खोले जब इसे खोला जाता है और जब लेखन होता है। लिखने / अपडेट करने और अंतिम जोखिमों की तलाश करने के लिए फ़ाइल डेटा को दूषित करना अगर एक ही समय में एक ही फ़ाइल में कई चीजें लिखने की कोशिश की जाती है। दुर्भाग्य से, मेरा मानना ​​है कि फ़ाइल को सुनिश्चित करने के लिए ओपन-टू-ऐपेंड के लिए एकमात्र दौड़-शर्त-सुरक्षित तरीका है पहले फ़ाइल मौजूद है (इसके बजाय O_CREAT के बिना O_APPEND) निम्न-स्तरीय os.open () दिनचर्या का उपयोग करना है।
फॉगोड

1
@LorinczyZsigmond जो कार्यान्वयन-निर्भर व्यवहार की तरह लगता है। एक स्रोत साझा करने के लिए देखभाल?
कीरिल

2110

आप os.path.existsसमारोह है:

import os.path
os.path.exists(file_path)

यह Trueदोनों फ़ाइलों और निर्देशिकाओं के लिए रिटर्न देता है , लेकिन आप इसके बजाय उपयोग कर सकते हैं

os.path.isfile(file_path)

परीक्षण करने के लिए कि क्या यह विशेष रूप से एक फ़ाइल है। यह सहजीवन का अनुसरण करता है।


965

इसके विपरीत 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


319

के 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")

60
कई स्थितियां होने से, जिनमें से कुछ अतिश्योक्तिपूर्ण हैं, कम स्पष्ट और स्पष्ट है।
विम

10
यह बेमानी भी है। यदि फ़ाइल मौजूद नहीं है, os.access()तो गलत वापस आ जाएगी।
user207421

9
@EJP लिनक्स में फाइल मौजूद हो सकती है लेकिन एक्सेसेबल नहीं।
ई-इन्फोरमेशन

8
चूंकि import os, आपको import os.pathफिर से ज़रूरत नहीं है क्योंकि यह पहले से ही का हिस्सा है os। आपको बस आयात करने की ज़रूरत है os.pathयदि आप केवल छोटी चीज़ों को आयात करने के लिए ही os.pathनहीं बल्कि osस्वयं से कार्यों का उपयोग करने जा रहे हैं , लेकिन जैसा कि आप उपयोग करते हैं os.accessऔर os.R_OK, दूसरे आयात की आवश्यकता नहीं है।
जेस्टर


245

यद्यपि मौजूदा उत्तरों (जैसे पायथन 3.4 ) में लगभग हर संभव तरीके को (कम से कम एक) सूचीबद्ध किया गया है विशिष्ट सामान जोड़ा गया था), मैं सब कुछ एक साथ करने की कोशिश करूंगा।

नोट : पायथन मानक पुस्तकालय कोड का हर टुकड़ा, जो मैं पोस्ट करने जा रहा हूं, 3.5.3 संस्करण के अंतर्गत आता है ।

समस्या कथन :

  1. फ़ाइल की जाँच करें ( तर्क : भी फ़ोल्डर ("विशेष" फ़ाइल)?) अस्तित्व
  2. कोशिश मत करो / छोड़कर / अन्यथा / अंत में ब्लॉक

संभावित समाधान :

  1. [पायथन 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

    1.1। [अजगर 3]: पथ। is_file ()

    • यह एक कट्टर (और अधिक अजगर आईसी) रास्तों को संभालने का तरीका है, लेकिन
    • हुड के तहत, यह बिल्कुल वैसा ही काम करता है ( 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
  2. [पायथन ३]: स्टेटमेंट कॉन्टेक्स्ट मैनेजर्स के साथ । कोई एक:

    • एक बनाए:

      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. फाइलसिस्टम ट्रैवर्सल फ़ंक्शन (और मिलान आइटम के लिए परिणाम खोजें)


    चूँकि इन फोल्डर पर (ज्यादातर मामलों में) वे हमारी समस्या के लिए अक्षम हैं (अपवाद हैं, जैसे नॉन वाइल्डकार्ड ग्लोब बिंग - जैसा कि @ शादो रेंजर ने बताया), इसलिए मैं उनके लिए जोर नहीं दे रहा हूं। यह उल्लेख नहीं करने के लिए कि कुछ मामलों में, फ़ाइल नाम प्रसंस्करण की आवश्यकता हो सकती है।

  4. [अजगर 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 है )
    • मैं _waccess का उपयोग कर रहा हूं ताकि Python3 और Python2 पर समान कोड काम करे ( उनके बीच यूनिकोड से संबंधित मतभेदों के बावजूद )
    • यद्यपि यह एक बहुत विशिष्ट क्षेत्र को लक्षित करता है, लेकिन पिछले उत्तरों में से किसी में भी इसका उल्लेख नहीं किया गया था


    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 () द्वारा लोड की गई सभी साझा ऑब्जेक्ट्स ।

      • मुख्य (वर्तमान) कार्यक्रम ( अजगर ) लिबास के खिलाफ जुड़ा हुआ है , इसलिए इसके प्रतीक ( पहुंच सहित ) लोड किए जाएंगे
      • इसे देखभाल के साथ संभालना होगा, क्योंकि मुख्य , Py_Main और (सभी) अन्य जैसे कार्य उपलब्ध हैं; उन्हें कॉल करना विनाशकारी प्रभाव (वर्तमान कार्यक्रम पर) हो सकता है
      • यह विन पर भी लागू नहीं होता (लेकिन यह इतनी बड़ी बात नहीं है, क्योंकि msvcrt.dll "% SystemRoot% \ System32" में स्थित है, जो डिफ़ॉल्ट रूप से % PATH% में है)। मैं चीजों को और आगे ले जाना चाहता था और विन पर इस व्यवहार को दोहराता था (और एक पैच सबमिट करता था), लेकिन जैसा कि यह पता चला है, [MS.Docs]: GetProcAddress फ़ंक्शन केवल " निर्यात किए गए प्रतीकों " को देखता है , इसलिए जब तक कि कोई व्यक्ति मुख्य योग्य कार्यों को घोषित नहीं करता है के रूप में __declspec(dllexport)(क्यों पृथ्वी पर नियमित व्यक्ति ऐसा करेगा?), मुख्य कार्यक्रम लोड करने योग्य है, लेकिन बहुत अधिक अनुपयोगी है
  5. फ़ाइल सिस्टम क्षमताओं के साथ कुछ तृतीय-पक्ष मॉड्यूल स्थापित करें

    सबसे अधिक संभावना है, ऊपर दिए गए तरीकों में से एक पर भरोसा करेगा (शायद मामूली अनुकूलन के साथ)।
    एक उदाहरण होगा (फिर से, जीत विशिष्ट) [GitHub]: mhammond / pywin32 - अजगर विंडोज (pywin32) एक्सटेंशन के लिए है, जो एक है अजगर के ऊपर आवरण WINAPI रों।

    लेकिन, चूंकि यह एक वर्कअराउंड की तरह अधिक है, मैं यहां रोक रहा हूं।

  6. एक और (लंगड़ा) वर्कअराउंड ( गेनरी ) है (जैसा कि मैं इसे कॉल करना पसंद करता हूं), 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

निचला रेखा :

  • क्या उपयोग कोशिश / सिवाय / किसी और / अंत में ब्लॉक, क्योंकि वे आप बुरा समस्याओं की एक श्रृंखला में चल रोका जा सकता है। एक काउंटर-उदाहरण, जिसके बारे में मैं सोच सकता हूं, वह प्रदर्शन है: ऐसे ब्लॉक महंगे हैं, इसलिए उन्हें कोड में न रखने का प्रयास करें कि इसे प्रति सेकंड सैकड़ों बार (लेकिन ज्यादातर मामलों में) डिस्क एक्सेस शामिल करना चाहिए। यह मामला नहीं होगा)।

अंतिम नोट :

  • मैं इसे अद्यतित रखने की कोशिश करूंगा, किसी भी सुझाव का स्वागत है, मैं उपयोगी कुछ भी शामिल करूंगा जो उत्तर में आएगा

3
क्या आप इस कथन पर विस्तार से बता सकते हैं? "हालांकि यह एक अच्छा अभ्यास नहीं है, मैं कॉल में os.F_OK का उपयोग कर रहा हूं, लेकिन यह केवल स्पष्टता के लिए है (इसका मूल्य 0 है"
sk8asd123

6
@ sk8asd123: एक टिप्पणी में इसे करने के लिए कठिन की तरह: आम तौर पर, यह उन कार्यों के साथ स्थिरांक का उपयोग करने के लिए सबसे अच्छा है जो वे साथ मिलकर करते हैं। कई मॉड्यूल के साथ काम करते समय यह लागू होता है जो समान को परिभाषित करते हैं, क्योंकि कुछ अद्यतित नहीं हो सकते हैं, और यह फ़ंक्शन और स्थिरांक के लिए सबसे अच्छा है। Ctypes के साथ काम करते समय (सीधे फ़ंक्शन को कॉल करते हुए) मुझे निरंतर ( MSDN से ) को परिभाषित करना चाहिए , या बिल्कुल भी एक निरंतर का उपयोग नहीं करना चाहिए। यह सिर्फ एक दिशानिर्देश है जिसका मैं उपयोग करता हूं, 99.9% में यह संभवतः कोई अंतर नहीं करता है (कार्यात्मक रूप से)।
CristiFati

3
@CristiFati: 3.6 के रूप में, glob.iglob(और glob.globसाथ ही) पर आधारित हैंos.scandir , इसलिए यह अब आलसी है; 10M फ़ाइलों की निर्देशिका में पहली हिट पाने के लिए, आप केवल तब तक स्कैन करते हैं जब तक आप पहली हिट तक नहीं पहुंच जाते। और यहां तक ​​कि प्री-3.6, यदि आप globकिसी वाइल्डकार्ड w / o के तरीकों का उपयोग करते हैं, तो फ़ंक्शन स्मार्ट है: यह जानता है कि आप केवल एक हिट कर सकते हैं, इसलिए यह ग्लोबिंग को सिर्फ os.path.isdirयाos.path.lexists (इस बात पर निर्भर करता है कि क्या रास्ता समाप्त होता है /)।
छत्तीसगढ़

3
मेरी टिप्पणी का दूसरा हिस्सा (गैर-वाइल्डकार्ड वाली ग्लोबिंग वास्तव में फ़ोल्डर को पुनरावृत्त नहीं करता है, और कभी नहीं) इसका मतलब यह है कि यह समस्या का पूरी तरह से कुशल समाधान है (सीधे फोन करने की तुलना में धीमा है os.path.isdirया os.path.lexistचूंकि यह पायथन स्तर फ़ंक्शन कॉल और स्ट्रिंग का एक गुच्छा है। कुशल मार्ग को तय करने से पहले संचालन व्यवहार्य है, लेकिन कोई अतिरिक्त सिस्टम कॉल या आई / ओ काम नहीं करता है, जो परिमाण धीमा करने के आदेश है)।
शैडो रेंजर

154

यह जाँचने का सबसे सरल तरीका है कि कोई फ़ाइल मौजूद है या नहीं। सिर्फ इसलिए कि फ़ाइल अस्तित्व में है जब आपने जाँच की है कि यह गारंटी नहीं है कि यह तब होगा जब आपको इसे खोलने की आवश्यकता होगी।

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

17
जब तक आप फ़ाइल तक पहुंचने का इरादा रखते हैं, तब तक दौड़ की स्थिति मौजूद रहती है , भले ही आपका कार्यक्रम कैसा भी हो। आपका प्रोग्राम यह गारंटी नहीं दे सकता कि कंप्यूटर पर किसी अन्य प्रक्रिया ने फ़ाइल को संशोधित नहीं किया है। यह वही है जो एरिक लिपर्ट एक बहिर्जात अपवाद के रूप में संदर्भित करता है । आप फ़ाइल के अस्तित्व के लिए पहले से जाँच करके इससे बच नहीं सकते।
आइजैक सुपेने

@IsaacSupeene सबसे अच्छा अभ्यास एक उचित अपवाद से निपटने के बाद संभव के रूप में छोटे (फ़ाइल) ऑपरेशन की खिड़की बनाने के लिए है
un33k

145

पायथन 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

124

कोशिश कथन को प्राथमिकता दें। यह बेहतर शैली माना जाता है और दौड़ की स्थिति से बचा जाता है।

इसके लिए मेरा शब्द मत लो। इस सिद्धांत के लिए बहुत समर्थन है। यहाँ एक जोड़ी है:


3
कृपया अपने कथन का समर्थन करने के लिए बेहतर स्रोत जोड़ें।
ब्लूट्रिन

11
उद्धृत टालने की दौड़ की स्थिति (ऐप्पल देव समर्थन) लिंक आपके उत्तर का समर्थन नहीं करता है। यह केवल अस्थायी फ़ाइलों का उपयोग करने की चिंता करता है जिसमें खराब डिज़ाइन किए गए ऑपरेटिंग सिस्टम पर संवेदनशील जानकारी होती है जो प्रतिबंधित अनुमतियों के माध्यम से अस्थायी रूप से सैंडबॉक्स अस्थायी फ़ाइलों / निर्देशिकाओं को नहीं करते हैं। का प्रयोग try...exceptनहीं करता है मदद संकल्प है कि समस्या वैसे भी।
jstine

इस पद्धति के साथ समस्या यह है कि यदि आपके पास मौजूद नहीं है फ़ाइल के आधार पर कोड का एक महत्वपूर्ण टुकड़ा है, तो इसे except:क्लॉज़ में डालने से यह होगा कि आपके कोड के इस हिस्से में उत्पन्न होने वाला एक अपवाद एक भ्रामक संदेश देगा (दूसरी त्रुटि के दौरान उठाया गया) पहले एक का प्रसंस्करण।)
कैमियन

119

मैं यह कैसे जाँच सकता हूँ कि क्या कोई फ़ाइल मौजूद है, कोशिश बयान का उपयोग किए बिना पायथन का उपयोग करके?

अब पायथन 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!) को चुपचाप पारित करने की अनुमति देता है, जो बग को छिपाने का एक अच्छा तरीका है।

यह उपयोगकर्ताओं को खराब प्रथाओं को अपनाने के लिए प्रोत्साहित करता है।


87
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


9
यह उत्तर गलत है। os.path.existsउन चीज़ों के लिए सही है जो फाइलें नहीं हैं, जैसे निर्देशिका। इससे झूठी सकारात्मकता मिलती है। सलाह देने वाले अन्य उत्तर देखें os.path.isfile
क्रिस जॉनसन

84

फ़ाइलों और फ़ोल्डरों के लिए परीक्षण 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

72

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():
    ...

3
क्या मैं पूछ सकता हूं: इस जाँच के लिए python3 में मॉड्यूल 'os' के बजाय मॉड्यूल 'pathlib' का उपयोग करने से क्या फायदा है?
जोको

3
pathlibपथ के लिए अजगर का ओओपी समाधान है। आप इसके साथ बहुत कुछ कर सकते हैं। यदि आपको केवल अस्तित्व की जांच करने की आवश्यकता है, तो लाभ इतना बड़ा नहीं है।
काइबरीक्स

65

ऐसा लगता नहीं है कि कोशिश / को छोड़कर और के बीच एक सार्थक कार्यात्मक अंतर है 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'

यदि आपको फ़ाइल लॉकिंग की आवश्यकता है, तो यह एक अलग मामला है।


3
यह उत्तर गलत है। os.path.existsउन चीज़ों के लिए सही है जो फाइलें नहीं हैं, जैसे निर्देशिका। इससे झूठी सकारात्मकता मिलती है। सलाह देने वाले अन्य उत्तर देखें os.path.isfile
क्रिस जॉनसन

6
आपके तीसरे उदाहरण पर, मैं filepathसही समय के साथ एक लिंक बनाता हूं , और BAM , आप लक्ष्य फ़ाइल को अधिलेखित कर देते हैं। आपको समस्या से बचने के लिए ब्लॉक open(filepath, 'wx')में करना चाहिए try...except
स्पेक्टर्स

1
अपने दूसरे उदाहरण में, Windows में कम से कम, आप एक मिल जाएगा OSError, तो filepath + '.old'पहले से मौजूद है: "Windows पर, अगर डीएसटी पहले से मौजूद है, OSError बढ़ा दी जाएगी, भले ही यह एक फ़ाइल है, एक परमाणु नाम बदलने जब डीएसटी लागू करने के लिए कोई रास्ता नहीं हो सकता है एक मौजूदा फ़ाइल का नाम। "
टॉम मायडेल्टन

@TomMyddeltyn: Python 3.3 के रूप में,os.replace गंतव्य फ़ाइल के चुप प्रतिस्थापन को प्रदर्शित करता है (यह os.rename's Linux व्यवहार के समान है ) (यह केवल त्रुटी है यदि गंतव्य का नाम मौजूद है और एक निर्देशिका है)। तो आप 2.x पर अटक गए हैं, लेकिन Py3 उपयोगकर्ताओं के पास कई वर्षों से एक अच्छा विकल्प है।
छत्तीसगढ़

पर renameउदाहरण: यह अभी भी से किया जाना चाहिए try/ exceptos.rename(या os.replaceआधुनिक पायथन पर) परमाणु है; यह जाँच करने के बाद फिर से नाम एक अनावश्यक दौड़ और अतिरिक्त सिस्टम कॉल का परिचय देता है। बस करते हैंtry: os.replace(filepath, filepath + '.old') except OSError: pass
ShadowRanger

59

आप इसे (सुरक्षित) आज़मा सकते हैं:

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] ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'जो भी हो')

फिर, परिणाम के आधार पर, आपका कार्यक्रम बस वहां से चालू रह सकता है या आप चाहें तो इसे रोकने के लिए कोड कर सकते हैं।


18
मूल प्रश्न एक समाधान के लिए कहा गया है जिसका उपयोग नहीं करता हैtry
rrs

5
यह उत्तर ओपी की बात को याद करता है। जाँच करना एक फ़ाइल मौजूद है, यह जाँचने के समान नहीं है कि क्या आप इसे खोल सकते हैं। ऐसे मामले होंगे जहां एक फ़ाइल मौजूद है, लेकिन कई कारणों से, आप इसे नहीं खोल सकते।
क्रिस जॉनसन

51

हालांकि मैं हमेशा उपयोग करने tryऔर exceptबयान देने की सलाह देता हूं , यहां आपके लिए कुछ संभावनाएं हैं (मेरा निजी पसंदीदा उपयोग कर रहा है os.access):

  1. फ़ाइल खोलने का प्रयास करें:

    फ़ाइल खोलना हमेशा फ़ाइल के अस्तित्व को सत्यापित करेगा। आप ऐसा ही एक समारोह कर सकते हैं:

    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
  2. उपयोग 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
  3. उपयोग 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)ताकि आप अपने मुद्दे को उम्मीद से निर्धारित कर सकें। मुझे उम्मीद है यह मदद करेगा! :)


51

दिनांक: 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']}

37

यदि फ़ाइल खोलने के लिए है तो आप निम्न तकनीकों में से एक का उपयोग कर सकते हैं:

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!')

अपडेट करें

बस भ्रम से बचने के लिए और मुझे मिले उत्तरों के आधार पर, वर्तमान उत्तर या तो दिए गए नाम के साथ एक फ़ाइल या एक निर्देशिका पाता है ।


9
यह उत्तर गलत है। os.path.existsउन चीज़ों के लिए सही है जो फाइलें नहीं हैं, जैसे निर्देशिका। इससे झूठी सकारात्मकता मिलती है। सलाह देने वाले अन्य उत्तर देखें os.path.isfile
क्रिस जॉनसन

झूठी सकारात्मक समस्या भी मिली।
Zorglub29

docs.python.org/3/library/os.path.html#os.path.exists क्रिस के उपरोक्त कथन के लिए >> os.path.exists (पाथ)> रिटर्न सही है अगर पथ मौजूदा पथ या खुले को संदर्भित करता है फ़ाइल विवरणक। टूटे प्रतीकात्मक लिंक के लिए गलत रिटर्न। कुछ प्लेटफार्मों पर, यह फ़ंक्शन गलत तरीके से वापस आ सकता है यदि अनुरोधित फ़ाइल पर os.stat () को निष्पादित करने की अनुमति नहीं दी गई है, भले ही शारीरिक रूप से मौजूद हो। संस्करण 3.3 में बदला गया: पथ अब पूर्णांक हो सकता है: यदि यह एक खुली फ़ाइल विवरणक है तो सही लौटा है, अन्यथा गलत। संस्करण 3.6 में परिवर्तित: एक पथ जैसी वस्तु को स्वीकार करता है।
JayRizzo

36

इसके अतिरिक्त os.access():

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()

होने के नाते R_OK, W_OKऔर X_OKअनुमति के लिए परीक्षण करने के लिए झंडे ( डॉक्टर )।


20
if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"

अपवादों को उठाना एक स्वीकार्य और पायथोनिक माना जाता है, आपके कार्यक्रम में प्रवाह नियंत्रण के लिए दृष्टिकोण। IOErrors के साथ लापता फ़ाइलों को संभालने पर विचार करें। इस स्थिति में, एक IOError अपवाद उठाया जाएगा यदि फ़ाइल मौजूद है, लेकिन उपयोगकर्ता के पास पढ़ने की अनुमति नहीं है।

SRC: http://www.pfinn.net/python-check-if-file-exists.html


3
ओपी ने पूछा कि अगर कोई फाइल मौजूद है तो कैसे जांच करें। किसी फ़ाइल का अस्तित्व होना संभव है, लेकिन आपके लिए इसे खोलना संभव नहीं है। इसलिए फ़ाइल की जाँच के लिए प्रॉक्सी के रूप में एक फ़ाइल खोलने का उपयोग करना यदि फ़ाइल मौजूद नहीं है, तो गलत निगेटिव होगा।
क्रिस जॉनसन

19

आप अन्य प्रयोजनों के लिए पहले से ही NumPy आयातित तो वहाँ की तरह अन्य पुस्तकालयों आयात करने के लिए कोई जरूरत नहीं है pathlib, os, paths, आदि

import numpy as np
np.DataSource().exists("path/to/your/file")

यह अपने अस्तित्व के आधार पर सही या गलत लौटेगा।


18

आप ब्रायन के सुझाव को बिना लिखे लिख सकते हैं 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

17

मैं एक पैकेज का लेखक हूं जो लगभग 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


17

चेक फ़ाइल या निर्देशिका मौजूद है

आप इन तीन तरीकों का अनुसरण कर सकते हैं:

नोट 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()

16

एक और मामूली बदलाव जोड़ना जो अन्य उत्तरों में बिल्कुल परिलक्षित नहीं होता है।

यह 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):

3
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)। पायथन एक खाली स्ट्रिंग गलत पर विचार करेगा जिस स्थिति में हम एक बूल के बजाय एक खाली स्ट्रिंग लौटाएंगे। इस फ़ंक्शन का उद्देश्य हमेशा बूल वापस करना है।
मार्सेल विल्सन

1
सच। इस मामले तथापि में, xहै os.path.isfile(..)तो यह पहले से ही bool है।
शहबाज

os.path.isfile(None)एक अपवाद उठाता है यही कारण है कि मैंने अगर चेक जोड़ा है। मैं शायद इसे केवल एक कोशिश में / इसके अलावा लपेट सकता था, लेकिन मुझे लगा कि यह इस तरह से अधिक स्पष्ट था।
मार्सेल विल्सन

3
return file_path and os.path.isfile(file_path)
पीटर वुड

15

यहाँ लिनक्स कमांड लाइन वातावरण के लिए 1 पंक्ति पायथन कमांड है। मुझे लगता है मैं बहुत गर्म बैश आदमी नहीं हूँ, क्योंकि यह बहुत ही मुश्किल है।

python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"

मुझे आशा है कि यह मददगार है।


6
बैश में वन-लाइन चेक: [ -f "${file}" ] && echo "file found" || echo "file not found"(जो कि जैसा है if [ ... ]; then ...; else ...; fi)।
फ्लोटज़िला

12

आप पायथन के "OS" पुस्तकालय का उपयोग कर सकते हैं:

>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False

5
यह उत्तर गलत है। os.path.existsउन चीज़ों के लिए सही है जो फाइलें नहीं हैं, जैसे निर्देशिका। इससे झूठी सकारात्मकता मिलती है। सलाह देने वाले अन्य उत्तर देखें os.path.isfile
क्रिस जॉनसन

@ क्रिस जॉनसन, os.path.exists () फ़ंक्शन जाँचता है कि सिस्टम में कोई पथ मौजूद है या नहीं। पथ एक निर्देशिका या फ़ाइल हो सकती है। यह दोनों मामलों पर ठीक काम करेगा। कृपया कुछ उदाहरण के साथ प्रयास करें
प्रदीप दास १४

तो, यह जवाब काम करता है। महान। Iff पथ फ़ाइल का नहीं है। क्या यही सवाल था? नंबर
डेबोसमित रे

निर्भर करता है। यदि एक "फ़ाइल" के अस्तित्व को निर्धारित करने का लक्ष्य यह पता लगाना है कि क्या पथ पहले से मौजूद है (और इसलिए ऐसा पथ नहीं है जहां नए डेटा को अन्य जानकारी को हटाने के बिना संग्रहीत किया जा सकता है), तो existsठीक है। यदि लक्ष्य यह निर्धारित करना है कि क्या यह संभवतया मौजूदा फ़ाइल खोलने के लिए सुरक्षित है, तो आलोचना उचित है और मौजूद पर्याप्त सटीक नहीं है। अफसोस की बात है, ओपी निर्दिष्ट नहीं करता है कि वांछित लक्ष्य क्या है (और शायद ऐसा कोई और नहीं करेगा)।
स्टार्टर

12

मैं कैसे जांच करूं कि कोई फ़ाइल मौजूद है, बिना कोशिश के बयान का उपयोग करते हुए?

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 के साथ लापता फ़ाइलों को संभालने पर विचार करना चाहिए ।


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

@ j6m8 हाँ, isReadableFile(path,fileName)वापस आ जाएगी Trueअगर फाइल \ धागा पहुंचा जा सकता है और इस प्रक्रिया \ प्रोग्राम द्वारा पढ़ी जा सकती है
Khaled.K
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.