26

Как проверить существование файла по определенному пути используя Python?

2

6 ответов 6

32
file_path = "path/to/file.txt"

Для проверки существования заданного пути используйте функцию os.path.exists:

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

Но она вернет True и для файла и для директории.

os.path.isfile проверит именно на наличие файла.

13

Кратко: вместо if exists(): open() используйте просто open().


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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
try:
    file = open('input.txt')
except IOError as e:
    print(u'не удалось открыть файл')
else:
    with file:
        print(u'делаем что-то с файлом')

Предварительная проверка всё равно не гарантирует, что файл всё е��ё будет существовать позднее и всё равно придётся ошибки обрабатывать.

В Питоне часто предпочтителен "Проще просить прощения, чем разрешения" ( "It is Easier to Ask for Forgiveness than Permission" -- EAFP) подход вместо "Look before you leap." более распространённого в С.


Ответы на комментарии:

  1. Где блок finally в котором вы закрывается поток

finally здесь не нужен. Если код попал в except блок, то файл не открыт -- нечего закрывать. В else ветке, где файл открыт, with file: конструкция всегда закрывает файл при выходе из блока (нормальном или когда исключение возникло).

  1. Конструкция try-exept-else многими считается плохо читаемой.

Обычно try/except не используется на том же уровне, то есть в коде используется просто:

with open('input.txt') as file:
    print(u'делаем что-то с файлом')

а возможные исключения выше по стеку обрабатываются. Но если вы хотите обработать ошибку в open() на том же уровне, то вы обязаны использовать try/except (open() сигнализирует ошибки с помощью исключений).

  1. Каждый раз, когда файла нет, вы вызываете прерывание ОС (на нем строится механизм обработки исключения) самостоятельно, не слишком ли это раcточительно?

Исключения выбрасываются в случае ошибки в Питоне хотите вы этого или нет. Вот реализация os.path.exists() из стандартной библиотеки:

def exists(path):
    try:
        os.stat(path)
    except OSError:
        return False
    return True

фактически, используя open() напрямую, а не if exists(): open() мы уменьшаем количество системных вызовов.

  1. Ваш код занял 7 строчек, не лучше ли эту задачу поручить операционной системе командой os.path.exists(path_to_file) в пару строчек ?

Длина кода, который не работает, не имеет значения. Ещё раз: вызов os.path.exists() не гарантирует что файл существует когда вы попытаетесь вызвать open() позднее: всё равно придётся обрабатывать ошибки.

Стоит упомянуть, что ��сли отсутствие файла не является ошибкой в вашем случае (ожидается программой), то вполне можно os.path.exists() или его аналоги использовать, чтобы подчеркнуть вероятность отсутствия файла для читателя кода (но так как последующее открытие файла может быть всё равно неудачным, то это не освобождает код от добавления обработки ошибок, подходящего для вашей задачи, такого как try/except выше).

6
  • Ужасный пример. 1. Где блок finally в котором вы закрывается поток ? 2. Конструкция try-exept-else многими считается плохо читаемой. 3. Каждый раз, когда файла нет, вы вызываете прерывание ОС (на нем строится механизм обработки исключения) самостоятельно, не слишком ли это раcточительно ? 4. Ваш код занял 7 строчек, не лучше ли эту задачу поручить операционной системе командой os.path.exists(path_to_file) в пару строчек ?
    – faoxis
    Commented 13 дек. 2016 в 6:04
  • 3
    @faoxis: у вас серьёзные пробелы в знании Питона 1- выучите, что with file: делает в Питоне 2- обычно try/except не используется на том же уровне, то есть в коде используется просто with open('input.txt') as file:, а возможные ошибки выше по стеку обрабатываются. 3- посмотрите на реализацию os.path.exists() 4- вызов os.path.exists() не гарантирует что файл существует когда вы попытаетесь вызвать open() позднее: всё равно придётся обрабатывать ошибки.
    – jfs
    Commented 13 дек. 2016 в 7:31
  • я работаю python junior'ом. Чего же вы от меня ждете ? :)
    – faoxis
    Commented 17 дек. 2016 в 9:51
  • 3
    @faoxis: тогда не делайте громкие заявления об ответе, если вы даже не понимаете код, который в нём написан. Объяснять, что ключевые слова (такие как with) в Питоне делают находится за рамками данного вопроса. Вы можете задать отдельный вопрос, если не ясно.
    – jfs
    Commented 17 дек. 2016 в 10:07
  • 3
    @faoxis: ваш комментарий "Где блок finally в котором вы закрывается поток ?" однозначно указывает, что вы не понимает что with file делает. Учитывая многочисленные ошибки в комментариях, вы запутываете будущих читателей. Старайтесь оставлять более конструктивные комментарии и поменьше необоснованных суждений.
    – jfs
    Commented 17 дек. 2016 в 11:35
6
import os

if os.path.exists(path_to_file):
   # файл существует
else:
   # файл не существует
4

В версии Python 3.5, между директориями используется двойной обратный слэш

import os

if os.path.exists("Имя_папки\\Имя_папки\\anytext.txt"): 
     print ("Файл найден")
else: 
     print ("Файл не найден")

Вместо функции print, вы можете использовать любое другое действие - Всё на ваш вкус)

3
import os
file_path = "path/to/file.txt"
if os.access(file_path, os.F_OK) == True:
            print("Файл существует")
0
try:
    print('Txt-File has been opened!')
    file = open('file.txt', 'r')
except OSError:
    print('Txt-file created!')
    file = open('file.txt', 'w')
1
  • 3
    добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. возможно, стоит привести пример использования. дополнить ответ можно, нажав править Commented 21 дек. 2019 в 18:10

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.