Python модуль импорта из каталога, ошибка чтения файла - PullRequest
0 голосов
/ 18 апреля 2020

Я использую python 3,7

Это файловая структура моего проекта

.
├── aa
│   ├── reader.py
│   └── readme.txt
└── m.py

1 directory, 3 files

в файле m.py:

import aa.reader as reader    
reader.read_file()

в файле reader.py:

def read_file():
    with open('readme.txt', 'r') as f:
        d = f.read()
    return d


if __name__ == '__main__':
    print(read_file())

в файле readme.txt :

this is the content of readme

Когда я запускаю файл m.py, я получаю эту ошибку:

ranick@r-ubt:~/Desktop/kk$ python m.py 
Traceback (most recent call last):
  File "m.py", line 4, in <module>
    reader.read_file()
  File "/home/ranick/Desktop/kk/aa/reader.py", line 3, in read_file
    with open('readme.txt', 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'readme.txt'

Как я могу исправить эту ошибку?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Когда вы работаете с относительными путями к файлам в Python, путь относится к текущему рабочему каталогу (cwd), а не к текущему местоположению файла.

Текущий рабочий каталог путь, с которого вы запускаете свой скрипт. В вашем случае cwd - это папка, содержащая скрипт m.py.

. Вам нужно изменить путь на readme.txt. Надежный вариант - получить путь к скрипту reader.py и использовать его для определения пути к файлу readme.txt. Вы можете использовать атрибут модуля __file__, чтобы получить полный путь к файлу модуля и затем извлечь имя каталога.

Новый reader.py

import os

def read_file():
    readme_path = os.path.join(os.path.dirname(__file__), 'readme.txt')

    with open(readme_path , 'r') as f:
        d = f.read()

    return d


if __name__ == '__main__':
    print(read_file())
0 голосов
/ 18 апреля 2020

Путь к файлу разрешается относительно пути, по которому вы назвали файл ввода python m.py из.

Чтобы решить эту проблему, вы можете либо использовать абсолютный путь к readme.txt, либо изменить 'readme.txt' на 'aa/readme.txt'.

Чтобы выяснить, к какому абсолютному пути применяется ваш относительный конец пути, вы можете сделать следующее из reader.py:

import os
print(os.getcwd())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...