Python3 не может прочитать или хотя бы найти файл

Я играю с python3+, но пока не могу заставить его прочитать файл, который является локальным для репозитория git.

вывод

pyyaml version = 5.3.1
Whoops! Can't find config.yml file --- exiting

Process finished with exit code 1

права доступа к файлам

-rw-r--r-- 1 pi pi  270 Nov 29 18:55 config.yml
drwxr-xr-x 8 pi pi 4096 Nov 30 12:54 .git
drwxr-xr-x 3 pi pi 4096 Nov 30 13:00 .idea
-rw-r--r-- 1 pi pi  447 Nov 30 13:19 main.py

код приложения

import requests
import yaml
import sys
from bs4 import BeautifulSoup


ymlversion = yaml.__version__
print("pyyaml version = " + ymlversion)


try:
    open("config.yml")
except FileNotFoundError:
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')

# open the yaml file and load it into data
with open("config.yml", "r") as yamlfile:
    data = yaml.load(yamlfile, Loader=yaml.FullLoader)
    print("Read successful")
print(data)

person Tony    schedule 30.11.2020    source источник
comment
Вы запускаете свой скрипт из каталога Git?   -  person Frodon    schedule 30.11.2020
comment
Что произойдет, если вы закомментируете блок try и запустите блок with?   -  person sphennings    schedule 30.11.2020
comment
Помните, что config.yal относится к вашему текущему рабочему каталогу, а не к каталогу, в котором находится main.py.   -  person Harrison Totty    schedule 30.11.2020
comment
Если ваш первый open завершится успешно, вы не закроете его, поэтому файл будет открыт дважды, как только ваш код сможет его найти. Я предлагаю вам использовать os.path.isfile() для проверки существования файла. Возможно, вы захотите сделать print(os.getcwd()), чтобы увидеть, какой у вас текущий каталог, чтобы вы знали, в каком каталоге Python ищет ваш входной файл.   -  person CryptoFool    schedule 30.11.2020


Ответы (2)


config.yml читается из текущего рабочего каталога, из которого вы его запускаете. Итак, либо запускайте скрипт из каталога, либо используйте __file__ (путь к файлу скрипта) и os.chdir, чтобы изменить свой cwd:

import os

os.chdir(os.path.dirname(__file__))

Вы также можете прочитать файл по пути os.path.join(os.path.dirname(__file__), "config.yml").

os.path.join и os.path.dirname — это функции управления путями, которые просто соединяют пути вместе и получают их имя каталога соответственно.

person Aplet123    schedule 30.11.2020
comment
Вы должны объяснить, что такое __file__ и что в противном случае делает ваш код. - person CryptoFool; 30.11.2020

Если файл yaml всегда находится рядом с файлом python, вы должны закодировать его:

import os
import yaml
import sys
from bs4 import BeautifulSoup

SCRIPTDIR = os.path.dirname(__file__)
YAMLFILE = os.path.join(SCRIPTDIR, 'config.yaml')

ymlversion = yaml.__version__
print("pyyaml version = " + ymlversion)

# Old way to check if file exists:
'''
try:
    open(YAMLFILE)
except FileNotFoundError:
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')
'''

# Better way to check if file exists:
if not os.path.exists(YAMLFILE):
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')

# open the yaml file and load it into data
with open(YAMLFILE, "r") as yamlfile:
    data = yaml.load(yamlfile, Loader=yaml.FullLoader)
    print("Read successful")
print(data)
person Frodon    schedule 30.11.2020
comment
Я бы посоветовал вам изменить первый open на os.path.exists(), так как в противном случае это утечка дескриптора файла. Вы можете показать ОП, как этого избежать, и попробовать/поймать. - person CryptoFool; 30.11.2020