os.path.expanduser是一个良好的开端 – 领先〜/扩展到“用户的主目录”,这是在Unix-y和Windows系统上合理启发的计算机.当然,您不希望直接将文件放在主目录中,但是它的子目录(如果不存在则必须进行)是合理的默认值.
当然,允许通过传递给程序的环境变量或命令行标志来覆盖此设置,因为某些平台对应用程序按照惯例放置此类辅助数据文件的位置非常挑剔.
编辑:OP请求一个例子:
Suppose I wanted it in ~/tempfoler/
and the file being passed to it was
args1.txt?
我建议通过以下函数找到确切的路径:
import errno
import os
def getfilepath(filename, foldername='tempfoler', envar='MYAPPDIR'):
# check for environmental override
if envar is not None and envar in os.environ:
dirpath = os.environ[envar]
else:
dirpath = '~/%s' % foldername
# expand and ensure it's a directory
expanded = os.path.expanduser(dirpath)
if not os.path.isdir(expanded):
if os.path.lexists(expanded):
# we're in dire trouble: the path is a file, not a directory!
# you could punt to some default value, but I prefer to raise
# an exception and allow higher levels to deal with this
raise IOError(errno.EEXISTS, "Path is a file, not a dir", expanded)
# the following may also raise (permission issues, &c)
os.makedirs(expanded)
# now the directory exists, the file may or may not (doesn't matter)
return os.path.join(expanded, filename)
这里嵌入了一些设计选择 – 为各种问题引发异常(更高级别可以捕获它们并适当地处理它们,例如要求用户提供替代方案 – 这个较低级别的功能无法正确执行!),返回文件的路径可能存在也可能不存在(因此适合于读取现有文件或编写新文件),等等.
你也可以选择做更少的检查,更多地依赖于针对各种异常情况引发的自动异常(反之亦然),我只是认为这种情况达到了合理的平衡(当然,如果你愿意的话,你很容易调整一下这种问题有点不同的方法).但关键的想法是始终关注可能出错的问题以及如何处理(通常通过更高级别的代码,可能要求用户选择替代方案的唯一适当点)来使您的软件健壮.