Каков предпочтительный способ проверить, существует ли файл и если его не создать?
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.