как проверить путь/файл существует или нет в python?

У меня есть два файла в каталоге abc

test.py
hello.txt

Файл test.py:

import os.path

if os.path.exists('hello.txt'):
  print('yes')
else:
  print('no')

при выполнении test.py в том же каталоге вывод, как я и ожидал, «да»

abc > python test.py

output: yes

но при попытке выполнить из другого каталога

~ > python ~/Desktop/abc/test.py

output: no

как это исправить

# the real case
if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

он работает при выполнении в каталоге abc, но не работает снаружи.


person zen29d    schedule 04.12.2019    source источник
comment
Укажите полный путь, например D:/harsha/inputs/abc.txt Это будет правильно выполняться в обоих случаях.   -  person Harsha Biyani    schedule 04.12.2019
comment
Возможно, вам нужно указать абсолютный путь вместо относительного пути.   -  person Arkistarvh Kltzuonstev    schedule 04.12.2019
comment
Вы хотите искать файл pickle в фиксированном месте или хотите искать его в том же каталоге, что и скрипт Python?   -  person John Gordon    schedule 04.12.2019
comment
@JohnGordon, я не хочу блокировать местоположение файла, он перемещается довольно   -  person zen29d    schedule 04.12.2019
comment
Хорошо, а как программа должна знать, где его искать?   -  person John Gordon    schedule 04.12.2019
comment
os.path.exists не является относительным ... Я не знаю, чем его заменить ... при запуске модуля python он работает, но при попытке выполнить из оболочки он терпит неудачу, есть ли какой-либо метод, который проверяет существование файла   -  person zen29d    schedule 04.12.2019
comment
Текущий рабочий каталог не является каталогом, содержащим скрипт; это текущий рабочий каталог, когда вы запускаете python.   -  person chepner    schedule 04.12.2019
comment
@chepner, тогда как это исправить, я хочу, чтобы скрипт считал каталог, в котором он находится, а не откуда запускается   -  person zen29d    schedule 04.12.2019


Ответы (5)


спасибо всем, наконец-то я нашел решение, никогда не думал, что это будет легко.... просто смените рабочий каталог и вуаля???? работа????????

import os
...
script_path = os.path.dirname(os.path.realpath(__file__))
os.chdir(script_path)
...
...
person zen29d    schedule 20.12.2019

Пройди полный путь, тильда

~

указывает, откуда вы "находитесь сейчас"

чтобы правильно указать его, сделайте полный путь. Самый простой способ сделать это — зайти в проводник, щелкнуть правой кнопкой мыши файл и нажать «Копировать путь». Это должно дать вам полный путь к файлу, который можно указать где угодно.

Пожалуйста, дайте мне знать, если это помогло!

person ItsLogic    schedule 04.12.2019
comment
Тильда означает относительно домашнего каталога, а не относительно того, где я сейчас нахожусь. - person John Gordon; 04.12.2019
comment
Я запускаю его из терминала, поэтому указывать путь каждый раз невозможно. Полный путь не подходит, потому что иногда нужно менять каталог. - person zen29d; 04.12.2019


ну а если не знать полного пути, то это ИМХО намного сложнее. У меня нет хорошей питонической идеи сделать это!

Чтобы найти файл на всем вашем ПК, используйте модуль подпроцесса и выполните команду «find» в Linux (вы используете Linux, верно?), перехватите вывод и спросите, есть ли ваш файл:

import subprocess

file_name = "test.txt"

sp = subprocess.Popen(["find", '/', "-name", file_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = sp.communicate()

found = False
for line in output:
    if file_name.encode() in line:
        found = True

print("Found:", found)

ПРИМЕЧАНИЕ. Чтобы ограничить поиск, замените «/» родительской папкой, в которой, как вы ожидаете, должен находиться файл.

РЕДАКТИРОВАТЬ: В Windows, хотя я не смог это проверить, команда будет выглядеть так: «dir /s /p hello.txt», поэтому вызов подпроцесса будет выглядеть так: sp = subprocess.Popen(["cmd", "/c", 'dir', '/s', '/p', 'Links'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

person Kalma    schedule 04.12.2019

Я вижу, вы уже разместили здесь ответ на свой вопрос

В любом случае, я хотел посоветовать вам, что нет необходимости использовать os.chdir() для этой цели, просто сделайте это так:

# the real case

path_to_your_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),"token.pickle")

if os.path.exists(path_to_your_file):
    with open(path_to_your_file, 'rb') as token:
        ...

P.S. Если вам интересно, есть несколько веских причин предпочесть использование os.path.join() вместо ручной конкатенации строк, основной из которых является во-первых, делает вашу платформу кодирования независимой

person danicotra    schedule 16.05.2020