Pythonic способ проверить, существует ли файл?

Каков предпочтительный способ проверить, существует ли файл и если его не создать?

Ответ 1

Чтобы проверить, является ли путь существующим файлом:

os.path.isfile(path)

Возвращает True, если путь является существующим обычный файл. Это следует за символическим ссылки, поэтому как islink(), так и isfile() может быть верным для того же путь.

Ответ 2

Вместо os.path.isfile, предложенного другими, я предлагаю использовать os.path.exists, который проверяет что-либо с этим именем, а не только является ли он обычным файлом.

Таким образом:

if not os.path.exists(filename):
    file(filename, 'w').close()

В качестве альтернативы:

file(filename, 'w+').close()

Последний создаст файл, если он существует, но не иначе. Однако он будет работать, если файл существует, но у вас нет разрешения на его запись. Вот почему я предпочитаю первое решение.

Ответ 3

Мне кажется, что все остальные ответы здесь (пока) не могут решить условие гонки, которое происходит с их предлагаемыми решениями.

Любой код, где вы сначала проверяете наличие файлов, а затем несколько строк позже в своей программе, вы создаете его, рискует создать файл, пока вы не ищете и не создаете проблем (или вы вызывая у владельца проблемы "этого другого файла" ).

Если вы хотите избежать такого рода вещей, я бы предложил что-то вроде следующего (непроверенного):

import os

def open_if_not_exists(filename):
    try:
        fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
    except OSError, e:
        if e.errno == 17:
            print e
            return None
        else:
            raise
    else:
        return os.fdopen(fd, 'w')

Это должно открыть файл для записи, если он еще не существует, и вернуть файл-объект. Если он существует, он напечатает "Ooops" и вернет None (непроверен и будет основываться исключительно на чтении документации python, поэтому может не быть 100 % correct).

Ответ 4

Если (когда файл не существует) вы хотите создать его как пустым, самый простой способ -

with open(thepath, 'a'): pass

(в Python 2.6 или лучше, в 2.5 для этого требуется "импорт из будущего" в верхней части вашего модуля).

Если, с другой стороны, вы хотите оставить файл в покое, если он существует, но в противном случае помещает конкретное непустое содержимое, более сложные подходы, основанные на блоках операторов if os.path.isfile(thepath):/else, вероятно, более подходят.

Ответ 5

Это был лучший способ для меня. Вы можете получить все существующие файлы (будь то символические ссылки или нормальные):

os.path.lexists(путь)

Return True if path refers to an existing path. Returns True for broken symbolic links. Equivalent to exists() on platforms lacking os.lstat().

New in version 2.4.