python - كيف يمكنني التحقق من وجود ملف باستخدام بيثون؟


كيف يمكنني التحقق من وجود ملف، بدون استخدام عبارة try ؟



Answers


إذا كان السبب الذي تريد التحقق منه هو أنه يمكنك إجراء شيء مثل if file_exists: open_it() ، فمن الأفضل استخدام try حول محاولة فتحه. فحص ثم فتح المخاطر الملف الذي تم حذفه أو نقله أو شيء بين عند التحقق وعند محاولة فتحه.

إذا كنت لا تخطط لفتح الملف على الفور، يمكنك استخدام os.path.isfile

عودة True إذا كان المسار هو ملف عادي موجود. هذا يتبع الروابط الرمزية، لذلك كلا إيسلينك () و إسفيل () يمكن أن يكون صحيحا لنفس المسار.

import os.path
os.path.isfile(fname) 

إذا كنت بحاجة للتأكد من انها ملف.

بدءا من بيثون 3.4، وحدة pathlib يقدم نهج كائن المنحى ( pathlib2 إلى 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() في كتلة try :

try:
    my_abs_path = my_file.resolve():
except FileNotFoundError:
    # doesn't exist
else:
    # exists



لديك وظيفة os.path.exists :

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

هذا يعود True لكل من الملفات والأدلة ولكن يمكنك بدلا من ذلك استخدام os.path.isfile لاختبار إذا كان ملف على وجه التحديد. ويتبع الارتباطات سيمبلينكس.




على عكس isfile() ، exists() سيعود True isfile() .
لذلك اعتمادا على إذا كنت تريد الملفات فقط عادي أو الدلائل أيضا، عليك استخدام isfile() أو exists() . هنا هو إخراج ريبل بسيط.

>>> print os.path.isfile("/etc/password.txt")
True
>>> print os.path.isfile("/etc")
False
>>> print os.path.isfile("/does/not/exist")
False
>>> print os.path.exists("/etc/password.txt")
True
>>> print os.path.exists("/etc")
True
>>> print os.path.exists("/does/not/exist")
False



import os.path

if os.path.isfile(filepath):



استخدم os.path.isfile() مع os.access() :

import os
import os.path

PATH='./file.txt'

if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
    print "File exists and is readable"
else:
    print "Either file is missing or is not readable"



import os
os.path.exists(path) # returns whether the path (dir or file) exists or not
os.path.isfile(path) # returns whether the file exists or not



هذا هو أبسط طريقة للتحقق مما إذا كان الملف موجود. فقط لأن الملف موجود عند فحص لا يضمن أنه سيكون هناك عندما كنت في حاجة لفتحه.

import os
fname = "foo.txt"
if os.path.isfile(fname):
    print("file does exist at this time")
else:
    print("no such file")



تفضل بيان التجربة. انها تعتبر أسلوب أفضل وتجنب ظروف السباق.

لاتأخذ كلماتي على محمل الجد. هناك الكثير من الدعم لهذه النظرية. وهنا زوجين:




بيثون 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/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



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 .




كيف يمكنني التحقق مما إذا كان ملف موجود، باستخدام بيثون، دون استخدام عبارة المحاولة؟

في بيثون 3.4 و، استخدم كائن Path جديد في pathlib .

from pathlib import Path
import tempfile

>>> root = Path('/')
>>> root.is_file()
False
>>> root.exists()
True

لذلك دعونا الحصول على الملف الذي نعرفه هو ملف:

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

بدون بيان محاولة:

كبح

بيثون 3.4 يعطينا مدير السياق suppress (سابقا ignore مدير السياق)، الذي يفعل بالضبط بالضبط نفس الشيء في عدد أقل من الخطوط، في حين أيضا (على الأقل سطحيا) تلبية الأصل يطلب تجنب بيان try :

from contextlib import suppress

with suppress(OSError), open(path) as f:
    f.read()

الاستعمال:

>>> with suppress(OSError), open('doesnotexist') as f:
...     f.read()
... 
>>>

ل بيثونس في وقت سابق، هل يمكن لفة 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.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



لا يبدو أن هناك فرق وظيفي مفيد بين محاولة / باستثناء و 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'

إذا كنت بحاجة إلى تأمين الملفات، فهذا أمر مختلف.




في عام 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():
    ...



يمكنك تجربة هذا (أكثر أمنا):

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

وسيكون التصويت:

([إرنو 2] لا يوجد مثل هذا الملف أو الدليل: 'what.txt')

ثم، اعتمادا على النتيجة، برنامجك يمكن أن تبقي فقط قيد التشغيل من هناك أو يمكنك رمز لوقفه إذا كنت تريد.




على الرغم من أنني أوصي دائما باستخدام try except البيانات، وهنا بعض الاحتمالات بالنسبة لك (بلدي المفضلة الشخصية يستخدم os.access ):

  1. جرب فتح الملف:

    فتح الملف سوف يتحقق دائما من وجود الملف. يمكنك جعل وظيفة تماما مثل ذلك:

    def File_Existence(filepath):
        f = open(filepath)
        return True

    إذا كان خطأ، فإنه سيتم إيقاف التنفيذ مع إورور غير مرئية أو أوزيرور في الإصدارات الأحدث من بيثون. للقبض على استثناء، لديك لاستخدام محاولة باستثناء شرط. وبطبيعة الحال، يمكنك دائما استخدام بيان استثناء` مثل ذلك (بفضل هساندت لجعل لي التفكير):

    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.py، الكتابة في 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/11/03 :

على الرغم من أنني أعتقد أن كل وسيلة ممكنة قد أدرجت في (واحد على الأقل من) الإجابات الحالية (على سبيل المثال بيثون 3.4 تمت إضافة الاشياء المحددة)، سأحاول تجميع كل شيء معا.

ملاحظة : كل ​​قطعة من رمز مكتبة بيثون القياسية أنني ذاهب إلى آخر، ينتمي إلى الإصدار 3.5.3 (يقتبس وثيقة هي الإصدار 3 محددة).

بيان المشكلة :

  1. تحقق من الملف ( قابل للنقاش : مجلد أيضا ("خاص" ملف)؟) وجود
  2. لا تستخدم try/except/else/finally كتل

الحلول الممكنة :

  1. [بيثون]: os.path.exists (أيضا التحقق من أعضاء الأسرة وظيفة أخرى مثل 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 ، سطر ~ # 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

    انها مجرد try/except كتلة حول [بيثون]: os.stat . لذلك، رمز الخاص بك هو try/except الحرة، ولكن أقل في فرامستاك هناك (على الأقل) واحدة من هذه الكتلة. ينطبق هذا أيضا على os.path.isfile أخرى ( بما في ذلك os.path.isfile ).

    1.1. [بيثون]: pathlib.Path.is_file

    • انها مربي الحيوانات (وأكثر بيثون إيك) طريقة التعامل مع المسارات، ولكن
    • تحت غطاء محرك السيارة، فإنه يفعل بالضبط نفس الشيء ( pathlib.py ، خط ~ # 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. [بيثون]: os.access سلوكه على مقربة من os.path.exists (في الواقع انها أوسع، وذلك أساسا بسبب الوسيطة الثانية )

    • قد تقيد أذونات المستخدم ملف "الرؤية" كما تنص الوثيقة:

      ... اختبار ما إذا كان المستخدم الذي يستدعي لديه الوصول المحدد إلى المسار . يجب أن يكون F_OK لاختبار وجود المسار ...

    os.access("/tmp", os.F_OK)

    شخصيا، أنا أفضل هذا واحد لأنه تحت غطاء محرك السيارة، ويدعو أبي الأصلي s (عن طريق "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" ):

    ملاحظة : استدعاء أبي الأصلي s هو ممكن أيضا عبر [بيثون]: كتيبس - مكتبة وظيفة خارجية لبيثون ، ولكن في معظم الحالات انها أكثر تعقيدا.

    ( وين محددة): منذ مسفر * ( فرونتيمي * ) تصدير [مسن]: _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", os.F_OK)
    -1

    ملاحظات :

    • على الرغم من أنها ليست ممارسة جيدة، وأنا باستخدام os.F_OK في المكالمة، ولكن هذا فقط للتوضيح (قيمتها 0 )
    • أنا أستخدم _waccess بحيث تعمل نفس الشفرة على Python3 و Python2 (على الرغم من الاختلافات ذات الصلة ونيكود بينهما)
    • على الرغم من أن هذا يستهدف منطقة محددة جدا، لم يذكر في أي من الإجابات السابقة


    و لنكس ( أوبتو (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"/tmp1", os.F_OK)
    -1

    ملاحظات :

    • وبدلا من ذلك، فإن مسار التشفير ليبك ( "/lib/x86_64-linux-gnu/libc.so.6" ) الذي قد (وعلى الأرجح سوف يختلف) عبر الأنظمة، None يمكن تمرير None (أو السلسلة الفارغة) إلى منشئ CDLL ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ). وفقا ل [رجل]: دلوبين (3) :

      إذا كان اسم الملف نول، فإن المقبض الذي تم إرجاعه هو للبرنامج الرئيسي. عند إعطاء دلسيم ()، يؤدي هذا المقبض للبحث عن رمز في البرنامج الرئيسي، تليها جميع الكائنات المشتركة تحميلها عند بدء تشغيل البرنامج، ثم كل الكائنات المشتركة تحميل بواسطة دلوبين () مع العلم RTLD_GLOBAL .

      • ويرتبط البرنامج الرئيسي (الحالي) ( الثعبان ) ضد ليبك ، لذلك سيتم تحميل رموزها (بما في ذلك access )
      • يجب التعامل مع هذا بعناية، حيث أن الوظائف مثل main ، Py_Main و (جميع) أخرى متاحة؛ يمكن أن يكون لها آثار كارثية (على البرنامج الحالي)
      • لا ينطبق هذا أيضا على وين (ولكن هذا ليس صفقة كبيرة، منذ msvcrt.dll الموجود في "٪ سيستمروت٪ \ System32" الذي هو في ٪ باث٪ افتراضيا). كنت أرغب في اتخاذ المزيد من الأمور وتكرار هذا السلوك على وين (وتقديم التصحيح)، ولكن كما اتضح، [مسن]: وظيفة جيتبروكادريس فقط "يرى" تصدير الرموز، لذلك ما لم يعلن شخص وظائف في __declspec(dllexport) الرئيسي كما __declspec(dllexport) (لماذا على الشخص العادي سوف تفعل ذلك؟)، البرنامج الرئيسي هو لوادابل ولكن غير صالحة للاستخدام إلى حد كبير
  3. استخدام [بيثون]: مع مديري سياق البيان . إما:

    • اصنع واحدا:

      class Swallow:  # Dummy example
          def __enter__(self):
              print("Entering...")
      
          def __exit__(self, exc_type, exc_value, exc_traceback):
              print("Exiting:", exc_type, exc_value, exc_traceback)
              return True
      • واستخدامها - سوف isfile السلوك isfile (لاحظ أن هذا هو فقط لأغراض التوضيح، لا تحاول كتابة هذه التعليمات البرمجية للإنتاج ):

        import os
        import stat
        
        
        def isfile2(path):
            result = False
            with Swallow():
                result = stat.S_ISREG(os.stat(path).st_mode)
            return result
    • استخدام [بيثون]: contentlib.suppress (* إكسيبيتيونس) - والذي تم تصميمه خصيصا لقمع الاستثناءات بشكل انتقائي


    ولكن، يبدو أنها مغلفة على try/except/else/finally كتل، كما [بيثون]: مع بيان ما يلي:

    وهذا يسمح محاولة مشتركة ... باستثناء ... أخيرا أنماط الاستخدام لتكون مغلفة لإعادة الاستخدام مريحة.

  4. استخدام وظائف اجتياز نظام الملفات (والبحث في نتائج مطابقة العنصر (العناصر)


    بما أن هذه التكرارات على المجلدات، فهي غير فعالة لمشكلتنا، لذلك أنا لن أصر عليها. ناهيك عن أنه في بعض الحالات، قد يكون مطلوبا معالجة اسم الملف.

  5. تثبيت بعض 3 حزب الحزب وحدة مع قدرات نظام الملفات

    على الأرجح، سوف تعتمد على واحدة من الطرق أعلاه (ربما مع التخصيصات طفيفة).
    مثال واحد هو (مرة أخرى، وين محددة) [سورسيفورج]: بيثون لنظام التشغيل ويندوز ملحقات (pywin32) ، وهو مجمع بايثون على وينابي s.

    ولكن، لأن هذا هو أشبه الحل ( الكسبار )، وأنا التوقف هنا.




بالإضافة إلى ذلك، os.access() :

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

يجري R_OK و W_OK و W_OK الأعلام لاختبار الأذونات ( وثيقة ).




في بيثون 3.4 توفر اللغة وحدة نمطية جديدة لإدارة الملفات:

import pathlib
path = pathlib.Path('path/to/file')
if path.is_file(): # If you want to check a directory: path.is_dir()
    # If it is true, return true on your code.






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




في ما يلي أمر بيثون سطر واحد لبيئة سطر الأوامر لينوكس. أجد هذا مفيد جدا منذ أنا لست مثل باش الرجل الساخن.

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

آمل أن يكون هذا مفيدا.




يمكنك كتابة اقتراح بريان دون 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



إضافة واحد أكثر اختلاف طفيف الذي لا ينعكس بالضبط في الأجوبة الأخرى.

سيتعامل هذا مع حالة 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):



يمكنك استخدام مكتبة "OS" من بيثون:

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



أنا مؤلف الحزمة التي تم حولها لنحو 10 عاما، ولها وظيفة يعالج هذه المسألة مباشرة. في الأساس، إذا كنت على ويندوز غير نظام، ويستخدم Popenللوصول find. ومع ذلك، إذا كنت على ويندوز، فإنه يعيد findمع الملفات كفاءة ووكر.

القانون نفسه لا يستخدم tryكتلة ... إلا في تحديد نظام التشغيل، وبالتالي توجيه لك إلى على غرار "يونكس" findأو اليد buillt find. وأظهرت الاختبارات أن توقيت tryكان أسرع في تحديد OS، هكذا فعلت استخدام واحد هناك (ولكن ليس في أي مكان آخر).

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




import os
path = /path/to/dir

root,dirs,files = os.walk(path).next()
if myfile in files:
   print "yes it 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 ) البق.

لذلك تعتبر استثناءات رفع ليكون مقبولا، وPythonic، نهج التحكم في التدفق في البرنامج. وينبغي للمرء أن ينظر في التعامل مع الملفات المفقودة مع IOErrors، بدلا من ifالبيانات ( مجرد نصيحة ).




للتحقق في حالة وجود ملف،

from sys import argv

from os.path import exists
script, filename = argv
target = open(filename)
print "file exists: %r" % exists(filename)



يمكنك استخدام الطريقة المفتوحة التالية لمعرفة ما اذا كان وجود ملف للقراءة +:

open(inputFile, 'r')