2015-03-19 7 views
0

У меня есть код, который восстанавливает несколько небольших файлов excel в python, используя pandas, и выполняет некоторый анализ данных на них. Теперь я пытаюсь настроить тестирование моего кода, но у меня возникают проблемы, и я не могу найти достойный ответ при поиске.Как указать каталог корневого модуля в python?

Вот структура каталогов моего кода:

my_project/ 
    __init__.py 
    code/ 
     __init__.py 
     analysiscode.py 
    tests/ 
     __init__.py 
     testcode.py 
    data/ 
     datafile.xlsx 

Я был первоначально запущен analysiscode.py из каталога code, поэтому я восстанавливал файл данных, указав путь так:

import pandas as pd 
df = pd.read_excel('../data/datafile.xlsx') 

Однако теперь, когда я пытаюсь запустить тесты кода из корневого каталога модуля (то есть my_project), путь, указанный для перехода в один каталог, прежде чем искать в каталоге данных, больше не работает.

Вот пример сообщения об ошибке:

my_project$ nosetests 
IOError: [Errno 2] No such file or directory: '../data/datafile.xlsx' 

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

Есть ли способ указать каталог my_project в python? Другими словами, есть ли способ сказать что-то вдоль линий

mydatadir = my_project/data 
df = pd.read_excel(mydatadir+'datafile.xlsx') 

Таким образом, я мог бы запустить программу анализа либо из my_project/code каталога или my_project директории без необходимости знать полный путь к my_project?

+1

попробуйте импортировать модуль ОС, то используйте 'os.chdir («..»)' для переключения в последний каталог, а затем выполнить команду как 'ДФ = pd.read_excel („данные/datafile.xlsx“)' –

+0

Спасибо за предложение. К сожалению, запуск кода из каталога 'my_project' с помощью' os.chdir («..")' и точки, удаленные из имени файла в вызове 'read_excel', ищут' my_project /../ data/datafile.xlsx'. То есть он ищет каталог данных, который находится на одном уровне от 'my_project' , который не сработает. – mgig

+0

Какая ОС вы используете? –

ответ

0

Это должно привести вас в базовый каталог (my_project) до тех пор, пока вы находитесь в my_project или в любом из его подкаталогов. После этого кода вы можете запускать команды, такие как
df = pd.read_excel('data/datafile.xlsx').

import os 
my_dir = "my_project" #Root Directory 
while os.getcwd().find(my_dir) >= 0: 
    os.getcwd("..") #Go back until you are out of the my_dir 
os.chdir(my_dir) #Go back into my_dir 
1

Я понял путь корневой модуль, используя __file__ после импорта my_project:

In [1]: import my_project 
In [2]: print(my_project.__file__) 
Out[2]: /Users/me/projects/my_project.__init__.py 

И избавившись от .__init__.py попасть в корневой каталог модуля через небольшую обработку строк:

In [3]: my_project_dir = '/'.join(str(my_project.__file__).split('/')[:-1]) 
In [4]: print(my_project_dir) 
Out[4]: '/Users/me/projects/my_project/' 

Применяя это к моему примеру выше, данные могут быть восстановлены независимо от того, каталог как это:

import my_project 
import pandas as pd 
my_project_dir = '/'.join(str(my_project.__file__).split('/')[:-1]) 
df = pd.read_excel(my_project_dir+'data/datafile.xlsx') 

Я проверил это, и теперь я могу успешно запустить analysiscode.py из каталога code, а также из каталога my_project и работает nosetests из каталога my_project работает Что ж.

Смежные вопросы