3

我正在尝试执行一条语句,但如果它失败了,我想执行 except 语句,然后我想再次执行 try。我知道我可以使用循环,但我正在寻找更优雅的解决方案。

在我的用例中,我尝试将文件保存到文件夹中,但如果收到 FileNotFoundError,我想在 except 中创建文件夹并再次尝试。

from pathlib import Path
import os

folder = Path('folder')
df = [a,b,c]

try:
    df.to_feather(folder / 'abc.ftr')
except:
    os.makedirs(folder)
    df.to_feather(folder / 'abc.ftr')

但在这种情况下,我会重复这df.to_feather(folder / 'abc.ftr')句话。如果语句变大,这会很烦人,我想避免为此构建函数。

另一种方法可能是:

if folder not in os.listdir():
    os.makedirs(folder)

df.to_feather(folder / 'abc.ftr')

这会是解决这个问题的“正确”方法吗?

4

2 回答 2

3

要回答标题中的问题,您可以递归地执行此操作:

def do_stuff(x):
    try:
        stuff(x)
    except SpecificException:
        other_stuff(x)
        do_stuff(x)

如果你想创建一个文件,你可以使用:

pathlib.Path('/tmp/sub1/sub2').mkdir(parents=True, exist_ok=True)
于 2021-12-07T09:45:03.193 回答
3

由于python3.2 os.makedirs具有可选exist_ok参数,默认情况下为False. 当设置True并被os.makedirs指示创建已经存在的目录时,它是无操作的。因此代替

if folder not in os.listdir():
    os.makedirs(folder)

df.to_feather(folder / 'abc.ftr')

你可以做

os.makedirs(folder, exist_ok=True)
df.to_feather(folder / 'abc.ftr')
于 2021-12-07T10:00:48.910 回答