Package: pyprojroot
Project-oriented workflow in PythonFinding project directories in Python (data science) projects.This library aims to provide both
the programmatic functionality from the Rrprojrootpackage
and the interactive functionality from the Rherepackage.MotivationProblem: I have a project that has a specific folder structure,
for example, one mentioned inNoble 2009or something similar tothis project template,
and I want to be able to:Run my python scripts without having to specify a series of../to get to thedatafolder.cdinto the directory of my python script instead of calling it from the root project directory and specify all the folders to the script.Reference datasets from a root directory when using a jupyter notebook because everytime I use a jupyter notebook,
the working directory changes to the location of the notebook, not where I launched the notebook server.Solution:pyprojrootfinds the root working directory for your project as apathlib.Pathobject.
You can now use theherefunction to pass in a relative path from the project root directory
(no matter what working directory you are in the project),
and you will get a full path to the specified file.
That is, in a jupyter notebook,
you can write something likepandas.read_csv(here('data/my_data.csv'))instead ofpandas.read_csv('../data/my_data.csv').
This allows you to restructure the files in your project without having to worry about changing file paths.Great for reading and writing datasets!Further reading:Project-oriented workflowsStop the working directory insanityOde to the here packageInstallationpippython-mpipinstallpyprojrootcondahttps://anaconda.org/conda-forge/pyprojrootcondainstall-cconda-forgepyprojrootExample UsageInteractiveThis is based on the Rherelibrary.frompyprojroot.hereimportherehere()ProgrammaticThis based on the Rrprojrootlibrary.importpyprojrootbase_path=pyprojroot.find_root(pyprojroot.has_dir(".git"))DemonstrationLoad the packagesIn [1]: from pyprojroot.here import here
In [2]: import pandas as pdThe current working directory is the "notebooks" folderIn [3]: !pwd
/home/dchen/git/hub/scipy-2019-pandas/notebooksIn the notebooks folder, I have all my notebooksIn [4]: !ls
01-intro.ipynb  02-tidy.ipynb  03-apply.ipynb  04-plots.ipynb  05-model.ipynb  Untitled.ipynbIf I wanted to access data in my notebooks I'd have to use../dataIn [5]: !ls ../data
billboard.csv  country_timeseries.csv  gapminder.tsv  pew.csv  table1.csv  table2.csv  table3.csv  table4a.csv  table4b.csv  weather.csvHowever, with thereherefunction, I can access my data all from the project root.
This means if I move the notebook to another folder or subfolder I don't have to change the path to my data.
Only if I move the data to another folder would I need to change the path in my notebook (or script)In [6]: pd.read_csv(here('data/gapminder.tsv'), sep='\t').head()
Out[6]:
       country continent  year  lifeExp       pop   gdpPercap
0  Afghanistan      Asia  1952   28.801   8425333  779.445314
1  Afghanistan      Asia  1957   30.332   9240934  820.853030
2  Afghanistan      Asia  1962   31.997  10267083  853.100710
3  Afghanistan      Asia  1967   34.020  11537966  836.197138
4  Afghanistan      Asia  1972   36.088  13079460  739.981106By the way, you get apathlib.Pathobject path back!In [7]: here('data/gapminder.tsv')
Out[7]: PosixPath('/home/dchen/git/hub/scipy-2019-pandas/data/gapminder.tsv')