it-swarm-eu.dev

Jak zjistím, zda soubor existuje bez výjimek?

Jak zjistím, zda soubor existuje nebo není, bez použití příkazu try ?

4981
spence91

Pokud je důvod, proč kontrolujete, tak můžete udělat něco jako if file_exists: open_it(), je bezpečnější použít try kolem pokusu o jeho otevření. Kontrola a poté otevírání rizika, že soubor bude odstraněn nebo přesunut nebo něco mezi tím, když budete kontrolovat a pokusíte se jej otevřít.

Pokud neplánujete soubor okamžitě otevřít, můžete použít os.path.isfile

Vrátit True jestliže cesta je existující pravidelný soubor. Toto následuje symbolické odkazy, takže oba islink () a isfile () mohou být pravdivé pro stejnou cestu.

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

pokud potřebujete mít jistotu, že je to soubor.

Počínaje Pythonem 3.4 modul pathlib nabízí objektově orientovaný přístup (backported do pathlib2 v Pythonu 2.7):

from pathlib import Path

my_file = Path("/path/to/file")
if my_file.is_file():
    # file exists

Chcete-li zkontrolovat adresář, postupujte takto:

if my_file.is_dir():
    # directory exists

Chcete-li zjistit, zda objekt Path existuje nezávisle na tom, zda se jedná o soubor nebo adresář, použijte exists():

if my_file.exists():
    # path exists

Můžete také použít resolve(strict=True) v bloku try:

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

Máte os.path.exists function:

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

To vrátí True pro oba soubory a adresáře ale vy můžete místo toho používat

os.path.isfile(file_path)

otestovat, zda se jedná konkrétně o soubor. Následuje symbolické odkazy.

1913
PierreBdR

Na rozdíl od isfile() , exists() se vrátí True pro adresáře.
Takže v závislosti na tom, zda chcete pouze obyčejné soubory nebo také adresáře, použijete isfile() nebo exists(). Zde je jednoduchý výstup REPL.

>>> 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
885
bortzmeyer
import os.path

if os.path.isfile(filepath):
543
Paul

Použít os.path.isfile() s 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 the file is missing or not readable"
268
Yugal Jindle
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
248
benefactual

Ačkoli téměř všechny možné cesty byly uvedeny v (alespoň jedné z) existujících odpovědí (např. Python 3.4 specifické věci byly přidány), pokusím se seskupit vše dohromady.

Poznámka : každý kus Python standardního knihovního kódu, který budu psát, patří do verze 3.5.3 .

Prohlášení o problému :

  1. Zkontrolujte soubor (arguable: také složka ("speciální" soubor)?) Existence
  2. Nepoužívejtetry/kromě/else/konečněbloků

Možná řešení :

  1. [Python 3]: os.path. existuje (cesta) (také zkontroluje ostatní členy rodiny jako os.path.isfile, os.path.isdir, os.path.lexists pro mírně odlišné chování)

    os.path.exists(path)
    

    Vrátit True pokud cesta odkazuje na existující cestu nebo otevřený popisovač souboru. Vrací False pro zlomené symbolické odkazy. Na některých platformách může tato funkce vrátit False, pokud není uděleno oprávnění k provedení os.stat () na požadovaném souboru, i když fyzicky existuje path.

    Všechno dobré, ale pokud následuje strom importu:

    • os.path - posixpath.py (ntpath.py)

      • genericpath.py, řádek ~ # 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
        

    je to jentry/kroměblock around [Python 3]: os. stat (cesta, *, dir_fd = None, follow_symlinks = True) . Takže váš kód jetry/kroměfree, ale nižší v rámci frametack je (alespoň) jedna takový blok. To platí i pro ostatní funcs ( včetně os.path.isfile).

    1.1. [Python 3]: Path. is_file ()

    • Je to milovník (a více python ic) způsob zpracování cest, ale
    • Pod kapotou to dělá přesně to samé (pathlib.py, řádek ~ # 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. [Python 3]: Se správci kontextu výpisu . Buď:

    • Vytvořit jeden:

      class Swallow:  # Dummy example
          swallowed_exceptions = (FileNotFoundError,)
      
          def __enter__(self):
              print("Entering...")
      
          def __exit__(self, exc_type, exc_value, exc_traceback):
              print("Exiting:", exc_type, exc_value, exc_traceback)
              return exc_type in Swallow.swallowed_exceptions  # only swallow FileNotFoundError (not e.g. TypeError - if the user passes a wrong argument like None or float or ...)
      
      • A jeho použití - replikuji chování os.path.isfile (všimněte si, že toto je jen pro účely demonstrace, dělat ne pokoušet se napsat takový kód pro výroba):

        import os
        import stat
        
        
        def isfile_seaman(path):  # Dummy func
            result = False
            with Swallow():
                result = stat.S_ISREG(os.stat(path).st_mode)
            return result
        
    • Použít [Python 3]: contextlib. potlačit (* výjimky) - který byl specificky určený pro selektivní potlačení výjimek


    Ale zdá se, že se jedná o obálky nadtry/kromě/else/konečněbloky, jako [Python 3]: with prohlášení uvádí:

    To umožňuje společné try ... kromě ... konečně použití vzory, které mají být zapouzdřeny pro pohodlné opakované použití.

  3. Přechodové funkce souborového systému (a hledání výsledků pro odpovídající položky)


    Vzhledem k tomu, že tyto iterace přes složky, (ve většině případů) jsou neúčinné pro náš problém (existují výjimky, jako je non wildcarded glob bing - jak @ ShadowRanger poukázal), takže já ' Nebudu na nich trvat. Nemluvě o tom, že v některých případech může být vyžadováno zpracování názvu souboru.

  4. [Python 3]: os. přístup (cesta, režim, *, dir_fd = Žádný, efektivní_id = False, follow_symlinks = True) jehož chování je blízko os.path.exists ( ve skutečnosti je to širší, hlavně kvůli tomu, že 2nd argument)

    • uživatelská oprávnění může omezit "viditelnost" souboru, jak uvádí doc:

      ... otestujte, zda má vyvolávající uživatel zadaný přístup k cesta. mode by mělo být F_OK testovat existenci cesty ...

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

    Protože pracuji také v C, používám i tuto metodu, protože pod kapotou zavolá nativní API s (opět přes "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c"), ale také otevírá bránu pro možné uživatelské chyby , a není to jako Python ic jako jiné varianty. Takže, jak @AaronHall správně poukázal, nepoužívejte jej, pokud nevíte, co děláte:

    Poznámka : volání nativní API s je také možné přes [Python 3]: ctypes - Knihovna cizích funkcí pro Python , ale ve většině případech je to složitější.

    (Winspecifické): Vzhledem k tomu, že vcruntime * (msvcr *) .dll vývozy a [MS .Docs]: _access, _waccess function family také, zde je příklad:

    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.notexist", os.F_OK)
    -1
    

    Poznámky :

    • I když to není dobrá praxe, používám os.F_OK ve volání, ale to je jen pro jasnost (jeho hodnota je 0 )
    • Používám _waccess, takže stejný kód funguje na Python3 a Python2 (navzdory unicode souvisejícím rozdílům mezi nimi)
    • Ačkoli se jedná o velmi specifickou oblast, nebyla uvedena v žádné z předchozích odpovědí


    The Lnx (Ubtu (16 x64)) protějšek:

    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"/tmp.notexist", os.F_OK)
    -1
    

    Poznámky :

    • Místo toho hardcoding libc 's cesta ("/lib/x86_64-linux-gnu/libc.so.6"), která se může (a pravděpodobně bude) lišit mezi systémy, None (nebo prázdný řetězec) může být předán CDLL konstruktoru (ctypes.CDLL(None).access(b"/tmp", os.F_OK)). Podle [man7]: DLOPEN (3) :

      Pokud filename je NULL, pak je vrácený popisovač pro hlavní program. Při zadání dlsym () způsobí tento popisovač hledání symbolu v hlavním programu, za nímž následují všechny sdílené objekty načtené při spuštění programu, a poté všechny sdílené objekty načtené pomocí dlopen () s příznakem RTLD_GLOBAL .

      • Hlavní (aktuální) program (python) je propojen s libc, takže jeho symboly (včetně přístup) budou načteny
      • To musí být řešeno opatrně, protože jsou k dispozici funkce jako {hlavní, Py_Maina (všechny) ostatní; volání by mohlo mít katastrofální následky (na současný program)
      • Toto se také nevztahuje na Win (ale to není tak velký problém, protože msvcrt.dll je umístěn v "% SystemRoot% 32" který je ve výchozím nastavení ve % PATH%. Chtěl jsem, aby se věci dále a replikovat toto chování na Win (a odeslat opravu), ale jak se ukázalo, [MS.Docs]: GetProcAddress funkce pouze "vidí" exportované symbols, takže pokud někdo deklaruje funkce v hlavním spustitelném souboru jako __declspec(dllexport) (proč by to na Zemi udělal regulární?), hlavní program je načtitelný, ale do značné míry nepoužitelný
  5. Nainstalujte nějaký modul třetích stran se schopnostmi souborového systému

    S největší pravděpodobností se bude spoléhat na jeden z výše uvedených způsobů (možná s mírnými úpravami).
    Jeden příklad by byl (znovu, Winspecifický) [GitHub]: mhammond/pywin32 - Python pro Windows (pywin32) Rozšíření , což je Python wrapper over WINAPI s.

    Ale protože je to spíše jako řešení, zastavuji se tady.

  6. Další (lame) řešení (gainarie) je (jako já to nazývám) sysadmin přístup: použití Python jako wrapperu k provádění příkazů Shell

    • Win:

      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe\" > nul 2>&1'))"
      0
      
      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe.notexist\" > nul 2>&1'))"
      1
      
    • Nix (Lnx (Ubtu)):

      [[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))"
      0
      [[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))"
      512
      

Dolní řádek :

  • Do usetry/kromě/else/konečněbloků, protože vám mohou zabránit spuštění do řady ošklivých problémů. Protipříkladem, který si myslím, je výkon: takové bloky jsou nákladné, takže se je snažte neukládat do kódu, který má běžet stovky tisíckrát za sekundu (ale protože (ve většině případů) zahrnuje přístup k disku, nebude to tak).

Závěrečná poznámka :

  • Pokusím se ho udržet v aktuálním stavu, všechny návrhy jsou vítány, budu včlenit cokoli, co se do odpovědi dostane
211
CristiFati

Toto je nejjednodušší způsob, jak zjistit, zda soubor existuje. Just protože soubor existoval, když jste zkontrolovali záruka že tam bude, když ho budete potřebovat otevřít.

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

Python 3.4+ má objektově orientovaný modul cesty: pathlib . Pomocí tohoto nového modulu můžete zkontrolovat, zda soubor existuje takto:

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

Při otevírání souborů můžete (a obvykle byste měli) stále používat blok try/except:

try:
    with p.open() as f:
        # do awesome stuff
except OSError:
    print('Well darn.')

Modul pathlib má v sobě spoustu skvělých věcí: pohodlný globbing, kontrola vlastníka souboru, snazší spojení cest, atd. Stojí za to odhlásit se. Pokud používáte starší Python (verze 2.6 nebo novější), můžete stále instalovat pathlib pomocí pipu:

# installs pathlib2 on older Python versions
# the original third-party module, pathlib, is no longer maintained.
pip install pathlib2

Poté jej importujte následujícím způsobem:

# Older Python versions
import pathlib2 as pathlib
132
Cody Piersall

Preferujte příkaz try. Je to považováno za lepší styl a vyhýbá se závodním podmínkám.

Neberte za to mé slovo. Je tu spousta podpory pro tuto teorii. Zde je pár:

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

Importování os usnadňuje navigaci a provádění standardních akcí s vaším operačním systémem.

Viz také Jak zkontrolovat, zda soubor existuje pomocí Pythonu?

Pokud potřebujete operace na vysoké úrovni, použijte shutil.

82
bishop

Testování souborů a složek s os.path.isfile(), os.path.isdir() a os.path.exists()

Za předpokladu, že "cesta" je platnou cestou, tato tabulka ukazuje, co je vráceno každou funkcí pro soubory a složky:

 enter image description here

Můžete také otestovat, zda je soubor určitým typem souboru pomocí os.path.splitext() k získání rozšíření (pokud ho ještě neznáte)

>>> 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
75
Tom Fuller

V roce 2016 je stále nejlepším způsobem použití os.path.isfile:

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

Nebo v Pythonu 3 můžete použít pathlib:

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

Nezdá se, že by existoval smysluplný funkční rozdíl mezi try/kromě a isfile(), takže byste měli použít ten, který dává smysl.

Pokud chcete číst soubor, pokud existuje, proveďte to

try:
    f = open(filepath)
except IOError:
    print 'Oh dear.'

Ale pokud jste chtěli jen přejmenovat soubor, pokud existuje, a proto ho nepotřebujete otevřít, udělejte to

if os.path.isfile(filepath):
    os.rename(filepath, filepath + '.old')

Pokud chcete zapisovat do souboru, pokud neexistuje, proveďte to

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

Pokud potřebujete zamykání souborů, je to jiná věc.

62
chad

Můžete to zkusit (bezpečněji):

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

Výstup by byl:

([Errno 2] Žádný takový soubor nebo adresář: 'what.txt')

Pak, v závislosti na výsledku, váš program může jen běžet odtamtud nebo můžete kód zastavit, pokud chcete.

53
philberndt

I když vždy doporučuji používat try a except prohlášení, zde je několik možností pro vás (můj osobní favorit je použití os.access):

  1. Zkuste soubor otevřít:

    Otevření souboru bude vždy ověřovat existenci souboru. Funkci můžete provést podobně:

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

    Pokud je to False, zastaví provádění s neopraveným IOError nebo OSError v novějších verzích Pythonu. Chcete-li zachytit výjimku, musíte použít klauzuli try kromě. Samozřejmě můžete vždy použít příkaz try s výjimkou takového (díky hsandt za to, že mě napadlo):

    def File_Existence(filepath):
        try:
            f = open(filepath)
        except IOError, OSError: # Note OSError is for later versions of Python
            return False
    
        return True
    
  2. Použít os.path.exists(path):

    Tím zkontrolujete existenci toho, co zadáte. Kontroluje však soubory a adresáře, takže si dávejte pozor na to, jak je používáte.

    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. Použít os.access(path, mode):

    To zkontroluje, zda máte přístup k souboru. Bude kontrolovat oprávnění. Na základě dokumentace os.py, zadáním os.F_OK, zkontroluje existenci cesty. Tímto způsobem však vytvoříte bezpečnostní díru, protože někdo může napadnout váš soubor pomocí času mezi kontrolou oprávnění a otevřením souboru. Místo toho, abyste zkontrolovali svá oprávnění, měli byste místo toho přejít přímo k otevření souboru. ( EAFP vs LBYP ). Pokud soubor poté neotevřete a pouze zkontrolujete jeho existenci, můžete to použít.

    Tady:

    >>> import os
    >>> os.access("/is/a/file.txt", os.F_OK)
    True
    

Měla bych také zmínit, že existují dva způsoby, jak nebudete moci ověřit existenci souboru. Buď bude problém permission denied nebo no such file or directory. Pokud chytíte IOError, nastavte IOError as e (jako moje první volba) a pak zadejte print(e.args), abyste mohli určit problém. Doufám, že to pomůže! :)

48
Zizouz212

Datum: 2017-12-04

Každé možné řešení bylo uvedeno v dalších odpovědích.

Intuitivní a diskutabilní způsob, jak zjistit, zda soubor existuje, je následující:

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

Udělal jsem pro váš odkaz vyčerpávající podvádku:

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

Navíc os.access():

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

Být R_OK, W_OK a X_OK příznaky pro testování oprávnění ( doc ).

32
zgoda

Pokud je soubor určen k otevření, můžete použít jednu z následujících metod:

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

AKTUALIZACE

Aby se předešlo nejasnostem a na základě odpovědí, které jsem dostal, aktuální odpověď nalezne buď soubor nebo a adresář s daným jménem.

30
bergercookie
if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"

Zvýšení výjimek je považováno za přijatelný a Pythonic přístup k řízení toku ve vašem programu. Zvažte zpracování chybějících souborů pomocí IOErrors. V této situaci bude výjimka IOError aktivována, pokud soubor existuje, ale uživatel nemá oprávnění ke čtení.

SRC: http://www.pfinn.net/python-check-if-file-exists.html

20
Pedro Lobito

Brianův návrh můžete napsat bez try:.

from contextlib import suppress

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

suppress je součástí Pythonu 3.4. Ve starších verzích můžete rychle napsat vlastní potlačení:

from contextlib import contextmanager

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

Pokud jste importovali NumPy již pro jiné účely, není třeba importovat další knihovny jako pathlib, os, paths atd.

import numpy as np
np.DataSource().exists("path/to/your/file")

To se vrátí pravdivé nebo nepravdivé na základě jeho existence.

17
durjoy

Zkontrolujte soubor nebo adresář

Můžete postupovat těmito třemi způsoby:

Poznámka 1: os.path.isfile se používá pouze pro soubory

import os.path
os.path.isfile(filename) # True if file exists
os.path.isfile(dirname) # False if directory exists

Poznámka 2: os.path.exists používaný pro soubory i adresáře

import os.path
os.path.exists(filename) # True if file exists
os.path.exists(dirname) #True if directory exists

Metoda pathlib.Path (obsažená v Pythonu 3+, instalovatelná s pipem pro Python 2)

from pathlib import Path
Path(filename).exists()
16
Ali Hallaji

Přidání ještě jedné mírné variace, která se v ostatních odpovědích neodráží přesně.

To bude zpracovávat případ file_path být None nebo prázdný řetězec.

def file_exists(file_path):
    if not file_path:
        return False
    Elif not os.path.isfile(file_path):
        return False
    else:
        return True

Přidání varianty založené na návrhu Shahbaz

def file_exists(file_path):
    if not file_path:
        return False
    else:
        return os.path.isfile(file_path)

Přidání varianty na základě návrhu od Petera Wooda

def file_exists(file_path):
    return file_path and os.path.isfile(file_path):
15
Marcel Wilson

Jsem autorem balíčku, který je asi 10 let, a má funkci, která tuto otázku řeší přímo. Pokud používáte systém, který není systémem Windows, používá v podstatě Popen pro přístup k find. Pokud však používáte Windows, replikuje find s účinným walkerem souborového systému.

Samotný kód nepoužívá try blok… kromě určování operačního systému a tedy řízení vás do "Unix" -style find nebo do ruky-buillt find. Testy načasování ukázaly, že try bylo rychlejší při určování OS, takže jsem ho tam použil (ale nikde jinde).

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

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

>>>

Implementace, pokud vám záleží, je zde: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190

15
Mike McKerns

Zde je 1 řádek příkazu Python pro prostředí příkazového řádku Linuxu. Zjistil jsem, že VELMI HANDY, protože nejsem tak horký Bash chlap.

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

Doufám, že je to užitečné.

Jak zkontroluji, zda soubor existuje, bez použití příkazu try?

V roce 2016 je to pravděpodobně nejjednodušší způsob, jak zkontrolovat, zda soubor existuje a pokud se jedná o soubor:

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

isfile je vlastně jen pomocná metoda, která interně používá os.stat a stat.S_ISREG(mode) pod nimi. Toto os.stat je metoda nižší úrovně, která vám poskytne podrobné informace o souborech, adresářích, soketech, vyrovnávacích pamětech a další. Více o os.stat zde

Poznámka: Tento přístup však soubor žádným způsobem nezablokuje, a proto se váš kód může stát zranitelným vůči " době kontroly na dobu použití " (TOCTTOU) chyby.

Zvýšení výjimek je tedy považováno za přijatelný a přístup Pythonic pro řízení toku ve vašem programu. A jeden by měl zvážit zpracování chybějících souborů s IOErrors, spíše než if prohlášení (jen rada).

11
Inconnu

Můžete použít knihovnu "OS" v Pythonu:

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

def isReadableFile(file_path, file_name):
    full_path = file_path + "/" + file_name
    try:
        if not os.path.exists(file_path):
            print "File path is invalid."
            return False
        Elif not os.path.isfile(full_path):
            print "File does not exist."
            return False
        Elif not os.access(full_path, os.R_OK):
            print "File cannot be read."
            return False
        else:
            print "File can be read."
            return True
    except IOError as ex:
        print "I/O error({0}): {1}".format(ex.errno, ex.strerror)
    except Error as ex:
        print "Error({0}): {1}".format(ex.errno, ex.strerror)
    return False
#------------------------------------------------------

path = "/usr/khaled/documents/puzzles"
fileName = "puzzle_1.txt"

isReadableFile(path, fileName)
9
Khaled.K

Chcete-li zkontrolovat, zda soubor existuje + čitelný, můžete použít následující metodu otevření:

open(inputFile, 'r')
9
user3197473
import os
path = /path/to/dir

root,dirs,files = os.walk(path).next()
if myfile in files:
   print "yes it exists"

To je užitečné při kontrole několika souborů. Nebo chcete provést nastavený průnik/odčítání s existujícím seznamem.

8
Jesvin Jose

Chcete-li zjistit, zda soubor existuje,

from sys import argv

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

Os.listdir můžete použít ke kontrole, zda je soubor v určitém adresáři.

import os
if 'file.ext' in os.listdir('dirpath'):
    #code
5
iPhynx
import os

# for testing purpose args defaulted to current folder & file. 
# returns True if file found
def file_exists(FOLDER_PATH='../', FILE_NAME=__file__):
    return os.path.isdir(FOLDER_PATH) \
        and os.path.isfile(os.path.join(FOLDER_PATH, FILE_NAME))

V podstatě kontrola složek, pak kontrola souboru s vhodným oddělením adresářů pomocí os.path.join .

4
Vimal Maheedharan

Měli byste určitě použít tento.

from os.path import exists

if exists("file") == True:
    print "File exists."
Elif exists("file") == False:
    print "File doesn't exist."
3
user2154354

Není to asi nutné, ale pokud ano, tady je nějaký kód

import os

def file_exists(path, filename):
    for file_or_folder in os.listdir(path):
        if file_or_folder == filename:
            return True
    return False