[Python] كيف يمكنني التحقق من وجود ملف باستخدام بيثون؟


Answers

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

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

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

Question

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




import os.path

if os.path.isfile(filepath):



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



على الرغم من أنني أوصي دائما باستخدام 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) بحيث يمكنك تحديد مشكلتك. اتمني ان يكون مفيدا! :)




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

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

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







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

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

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




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

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



أنا مؤلف الحزمة التي تم حولها لنحو 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




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

في عام 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البيانات ( مجرد نصيحة ).




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

open(inputFile, 'r')