检查目录是否存在并根据需要创建目录?
对此的直接答案是,假设有一个简单的情况,您不希望其他用户或进程弄乱您的目录:
if not os.path.exists(d):
os.makedirs(d)
或者如果使目录符合竞争条件(即如果检查路径是否存在,则可能已经建立了其他路径),请执行以下操作:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
但是,也许更好的方法是通过以下方式使用临时目录来避免资源争用问题tempfile
:
import tempfile
d = tempfile.mkdtemp()
以下是在线文档中的要点:
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
新的Python 3.5:pathlib.Path
与exist_ok
有一个新的Path
对象(从3.4版开始),它具有许多要与路径一起使用的方法-其中一个是mkdir
。
(在上下文中,我正在使用脚本跟踪我的每周代表。这是脚本中代码的相关部分,这些内容使我避免对同一数据每天多次遇到Stack Overflow。)
首先相关进口:
from pathlib import Path
import tempfile
我们现在不必处理os.path.join
-只需将路径部分与结合起来即可/
:
directory = Path(tempfile.gettempdir()) / 'sodata'
然后,我确定地确保目录存在- exist_ok
参数在Python 3.5中显示:
directory.mkdir(exist_ok=True)
这是文档的相关部分:
如果exist_ok
为true,FileExistsError
则POSIX mkdir -p
仅当最后一个路径组件不是现有的非目录文件时,才会忽略异常(与命令相同的行为)。
这里还有更多脚本-就我而言,我不受竞争条件的影响,我只有一个进程希望目录(或包含的文件)存在,并且我没有任何尝试删除的过程目录。
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
必须将对象强制转换为str
其他期望str
路径使用它们的API 。
也许应该更新Pandas以接受抽象基类的实例os.PathLike
。