我有使用pandas在python中恢复一些小excel文件的代码,并对它们执行一些数据分析。我现在正试图设置我的代码测试,但我遇到了一些麻烦,我在搜索时找不到合适的答案。
这是我的代码的目录结构:
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'
对于这种特殊情况,我总是可以指定完整路径,但我正在寻找更通用的解决方案,以便其他人可以下载此代码并仍然可以使用它。
有没有办法在python中指定my_project
目录?换句话说,有没有办法按照
mydatadir = my_project/data
df = pd.read_excel(mydatadir+'datafile.xlsx')
这样我可以从my_project/code
目录或my_project
目录运行分析代码,而无需知道my_project
的完整路径?
答案 0 :(得分: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
,并运行{{1}来自nosetests
目录也可以。
答案 1 :(得分: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