Estoy usando Python 3.7

Esta es la estructura de archivos de mi proyecto

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

1 directory, 3 files

en el archivo m.py:

import aa.reader as reader

reader.read_file()

en el archivo reader.py:

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

    return d


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

en el archivo readme.txt:

this is the content of readme

Cuando ejecuto el archivo m.py recibí este error:

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'

¿Cómo soluciono este error?

0
Ranick Patra 18 abr. 2020 a las 15:25

2 respuestas

Cuando trabaja con rutas relativas a archivos en Python, la ruta es relativa al directorio de trabajo actual (cwd), no a la ubicación actual del archivo.

El directorio de trabajo actual es una ruta desde la cual está iniciando su script. En su caso, cwd es una carpeta que contiene el script m.py.

Necesita cambiar la ruta a readme.txt. Una opción sólida es obtener la ruta al script reader.py y usarla para determinar la ruta al archivo readme.txt. Puede usar un atributo de módulo __file__ para obtener la ruta completa del archivo del módulo y luego extraer el nombre del directorio.

Nueva 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())
1
hgazibara 18 abr. 2020 a las 12:31

Las rutas de archivo se resuelven en relación con la ruta desde la que llamó al archivo de entrada python m.py.

Para resolver el problema, puede usar una ruta absoluta a readme.txt o cambiar 'readme.txt' a 'aa/readme.txt'.

Para saber a qué ruta absoluta se aplica su final de ruta relativo, puede hacer lo siguiente desde reader.py:

import os
print(os.getcwd())
0
Telcrome 18 abr. 2020 a las 12:34