I like to put all such non-code files in a project subdirectory (not a package) called resources, and then use the built-in package pkg_resources to access it.
For example, in my omission project, the module omission/game/content_loader.py needs to load the text file omission/resources/content/content.txt. I do that with...
import pkg_resources
class ContentLoader(object):
def __init__(self):
"""
Open the file and load the contents in.
"""
# ...
path = pkg_resources.resource_filename(
__name__,
os.path.join(os.pardir, 'resources', 'content', 'content.txt')
)
with open(path, 'rt', encoding='utf-8') as content_file:
raw_content = content_file.read()
# ...
Simple as that!
P.S. If you find yourself needing to access files outside of your project directory, say, in the user's home directory, I recommend the package appdirs.
I've had a play with this one. Considering I am dealing with an ini file, it appears that configparser does what I want. This is the snippet I've come up with:
def conf():
config = configparser.ConfigParser(converters={'list': lambda x: [i.strip() for i in x.split(',')]},
allow_no_value=True)
config.read('generateandsend/Resources/generateandsend.ini')
section = config['test']
string_a = section.get('StringA', None)
string_b = section.get('StringB', None)
return string_a, string_b
Is hard coding the relative path in that way frowned apon?
Beautiful. Thanks. I had to massage it a little and remove os.pardir, as it was giving me a false directory on my windows machine (C:\tmp\generateandsend\..\Resources\generateandsend.ini).
I also have one more question - if I wanted to include an ini/configuration file in a resources folder, how would I import it?
Thanks
I like to put all such non-code files in a project subdirectory (not a package) called
resources
, and then use the built-in packagepkg_resources
to access it.For example, in my
omission
project, the moduleomission/game/content_loader.py
needs to load the text fileomission/resources/content/content.txt
. I do that with...Simple as that!
P.S. If you find yourself needing to access files outside of your project directory, say, in the user's home directory, I recommend the package
appdirs
.Again, thanks for the reply.
I've had a play with this one. Considering I am dealing with an ini file, it appears that configparser does what I want. This is the snippet I've come up with:
Is hard coding the relative path in that way frowned apon?
Most certainly, especially because you have to account for differences in path format between operating systems.
I'd recommend incorporating
pkg_resources
into your approach above.I believe that will work? You'll have to check how
config.read()
handles an absolute path.Beautiful. Thanks. I had to massage it a little and remove
os.pardir
, as it was giving me a false directory on my windows machine (C:\tmp\generateandsend\..\Resources\generateandsend.ini
).The resultant path variable now looks like:
I just need to test this on my Linux box
Cheers again. Send the bill to...... 😉