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





15 Answers

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

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

هذا إرجاع True لكلا الملفين والأدلة ولكن يمكنك بدلاً من ذلك استخدام

os.path.isfile(file_path)

لاختبار ما إذا كان ملفًا على وجه التحديد. يتبع symlinks.

python file file-exists

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




import os.path

if os.path.isfile(filepath):



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



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

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



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

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




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 الاستيراد من التنقل وإجراء الإجراءات القياسية مع نظام التشغيل الخاص بك.

للرجوع اليها انظر أيضا share

إذا كنت بحاجة إلى عمليات عالية المستوى ، shutil




في عام 2016 ، لا تزال أفضل طريقة تستخدم os.path.isfile :

>>> os.path.isfile('/path/to/some/file.txt')

أو في Python 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))

سيكون ouput:

([Errno 2] لا يوجد ملف أو دليل مثل: "whatever.txt")

ثم ، اعتمادا على النتيجة ، يمكن للبرنامج الخاص بك أن يستمر في العمل من هناك أو يمكنك التعليمة البرمجية لإيقافه إذا كنت تريد.




في Python 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.



إذا كان الملف مفتوحًا ، فيمكنك استخدام أحد الأساليب التالية:

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

تحديث

فقط لتفادي الخلط واستنادا إلى الإجابات التي حصلت عليها ، تجد الإجابة الحالية إما ملفًا أو دليلًا بالاسم المحدد.




يمكنك كتابة اقتراح براين دون try:.

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()

suppressجزء من Python 3.4. في الإصدارات الأقدم ، يمكنك بسرعة كتابة منعك الخاص:

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass



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

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

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




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

لا يستخدم الكود في حد ذاته tryكتلة ... إلا في تحديد نظام التشغيل ومن ثم findتوجيهك إلى نمط "Unix" أو buillt اليد 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




تاريخ: 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')

لقد قدمت chitesheet شاملة للرجوع اليها:

#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']}



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

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






Related