python manejo de - ¿Cómo verifico si un archivo existe sin excepciones?




15 Answers

Tienes la función os.path.exists :

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

Esto devuelve True tanto para archivos como para directorios, pero puede usar

os.path.isfile(file_path)

para probar si es un archivo específicamente. Sigue los enlaces simbólicos.

archivos carpetas en

¿Cómo veo si un archivo existe o no, sin usar la declaración de 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



Esta es la forma más sencilla de verificar si existe un archivo. El hecho de que el archivo haya existido cuando lo verificó no garantiza que estará allí cuando necesite abrirlo.

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

La importación de os hace que sea más fácil navegar y realizar acciones estándar con su sistema operativo.

Para referencia, vea también share

Si necesita operaciones de alto nivel, use shutil .




En 2016, la mejor manera es usar os.path.isfile :

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

O en Python 3 puedes usar pathlib :

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...



Podrías probar esto (más seguro):

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

La salida sería:

([Errno 2] No existe tal archivo o directorio: 'whatever.txt')

Luego, dependiendo del resultado, su programa puede seguir ejecutándose desde allí o puede codificar para detenerlo si lo desea.




En Python 3.4, el lenguaje proporciona un nuevo módulo para administrar archivos:

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.



Si el archivo es para abrir, puede utilizar una de las siguientes técnicas:

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

ACTUALIZAR

Solo para evitar confusiones y según las respuestas que recibí, la respuesta actual encuentra un archivo o un directorio con el nombre dado.




Puedes escribir la sugerencia de Brian sin el try:.

from contextlib import suppress

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

suppressEs parte de Python 3.4. En versiones anteriores puedes escribir rápidamente tu propia supresión:

from contextlib import contextmanager

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



Aquí hay un comando de 1 línea de Python para el entorno de línea de comandos de Linux. Encuentro esto MUY BUENO ya que no soy un tipo Bash tan caliente.

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

Espero que esto sea útil.




Soy el autor de un paquete que ha existido durante unos 10 años y tiene una función que aborda esta pregunta directamente. Básicamente, si estás en un sistema que no es Windows, se usa Popenpara acceder find. Sin embargo, si está en Windows, se replica findcon un sistema de archivos eficiente.

El código en sí no usa un trybloque ... excepto para determinar el sistema operativo y así dirigirlo al estilo "Unix" findo al manual find. Las pruebas de tiempo mostraron que la trydeterminación del sistema operativo era más rápida, así que usé uno allí (pero en ningún otro lugar).

>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']

Y el doc ...

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

>>>

La implementación, si te interesa mirar, está aquí: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190




Fecha: 2017-12-04

Todas las soluciones posibles han sido enumeradas en otras respuestas.

Una forma intuitiva y discutible de verificar si un archivo existe es la siguiente:

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

Hice una hoja de trucos exhaustiva para su referencia:

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



¿Cómo verifico si existe un archivo, sin usar la instrucción try?

En 2016, esta es posiblemente la forma más fácil de verificar si existe un archivo y si es un archivo:

import os
os.path.isfile('./file.txt')    # Returns True if exists, else False

isfileEn realidad, es solo un método auxiliar que se usa internamente os.staty por stat.S_ISREG(mode)debajo. Este os.states un método de nivel inferior que le proporcionará información detallada sobre archivos, directorios, sockets, buffers y más. Más sobre os.stat aquí

Nota: Sin embargo, este enfoque no bloqueará el archivo de ninguna manera y, por lo tanto, su código puede ser vulnerable a los errores de " tiempo de verificación a tiempo de uso " ( TOCTTOU ).

Por lo tanto, se considera que generar excepciones es un enfoque aceptable y Pythonic para el control de flujo en su programa. Y uno debe considerar el manejo de archivos faltantes con IOErrors, en lugar de ifdeclaraciones ( solo un consejo ).






Related