python remove rename - Come posso verificare se un file esiste senza eccezioni?




15 Answers

Hai la funzione os.path.exists :

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

Questo restituisce True per entrambi i file e le directory, ma puoi invece usarlo

os.path.isfile(file_path)

per verificare se si tratta di un file specifico. Segue i collegamenti simbolici.

create files exists

Come faccio a vedere se un file esiste o no, senza usare la dichiarazione 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



Questo è il modo più semplice per verificare se esiste un file. Solo perché il file esisteva quando hai controllato non garantisce che sarà lì quando è necessario aprirlo.

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

L'importazione di os semplifica la navigazione e l'esecuzione di azioni standard con il tuo sistema operativo.

Per riferimento vedi anche share

Se hai bisogno di operazioni di alto livello, usa shutil .




Nel 2016 il modo migliore è ancora utilizzare os.path.isfile :

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

Oppure in Python 3 puoi usare pathlib :

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



Potresti provare questo (più sicuro):

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

L'uscita sarebbe:

([Errno 2] Nessun file o directory di questo tipo: 'whatever.txt')

Quindi, a seconda del risultato, il tuo programma può semplicemente continuare a funzionare da lì o puoi codificarlo per fermarlo se vuoi.




In Python 3.4 il linguaggio fornisce un nuovo modulo per gestire i file:

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.



Se il file è aperto, puoi utilizzare una delle seguenti tecniche:

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

AGGIORNARE

Giusto per evitare confusione e basato sulle risposte che ho ottenuto, la risposta corrente trova o un file o una directory con il nome dato.




Puoi scrivere il suggerimento di Brian senza il try:.

from contextlib import suppress

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

suppressfa parte di Python 3.4. Nelle versioni precedenti è possibile scrivere rapidamente la propria eliminazione:

from contextlib import contextmanager

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



Ecco un comando Python a 1 riga per l'ambiente della riga di comando di Linux. Trovo questo MOLTO HANDY dal momento che non sono un tipo Bash così sexy.

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

Spero che questo sia utile.




Sono l'autore di un pacchetto che esiste da circa 10 anni e ha una funzione che risponde direttamente a questa domanda. In sostanza, se si utilizza un sistema non Windows, viene utilizzato Popenper accedere find. Tuttavia, se si è su Windows, si replica findcon un efficiente walker del filesystem.

Il codice in sé non usa un tryblocco ... tranne che nel determinare il sistema operativo e quindi findguidarti allo stile "Unix" o al hand-buillt find. I test di cronometraggio hanno dimostrato che il trysistema operativo era più veloce nel determinare il SO, quindi ne ho usato uno lì (ma da nessun'altra parte).

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

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

>>>

L'implementazione, se ti interessa guardare, è qui: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190




Data: 2017/12/04

Ogni possibile soluzione è stata elencata in altre risposte.

Un modo intuitivo e discutibile per verificare se un file esiste è il seguente:

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

Ho fatto un cheatsheet esaustivo per il vostro riferimento:

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



Come posso verificare se esiste un file, senza usare la dichiarazione try?

Nel 2016, questo è ancora discutibilmente il modo più semplice per verificare se esiste un file e se si tratta di un file:

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

isfileè in realtà solo un metodo di supporto che utilizza internamente os.state al di stat.S_ISREG(mode)sotto. Questo os.statè un metodo di livello inferiore che ti fornirà informazioni dettagliate su file, directory, socket, buffer e altro. Maggiori informazioni su os.stat qui

Nota: tuttavia, questo approccio non bloccherà il file in alcun modo e pertanto il codice potrebbe diventare vulnerabile agli errori " time of check to time of use " ( TOCTTOU ).

Quindi sollevare le eccezioni è considerato un approccio accettabile e Pythonic per il controllo del flusso nel tuo programma. E si dovrebbe considerare la gestione dei file mancanti con IOErrors, piuttosto che le ifdichiarazioni ( solo un consiglio ).




Related