Каков предпочтительный способ проверить, существует ли файл и если его не создать?
Pythonic способ проверить, существует ли файл?
Ответ 1
Чтобы проверить, является ли путь существующим файлом:
Возвращает
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.
