6

我正在编写一些代码来增加文件名末尾的数字,直到它不再覆盖现有文件。我正在创建几个文件,它们都具有相同的基本文件名但不同的扩展名,我不想覆盖这些文件。

天真的版本:

prefix = 'hello0'
while os.path.exists(prefix + '.abc') or os.path.exists(prefix + '.def') or os.path.exists(prefix + '.ghi'):
    n = int(prefix[-1])
    prefix = prefix[:-1] + str(n + 1)  # I know this doesn't work when n reaches two digits; my full code involves a regular expression

当有多个扩展时,条件显然会变得非常长和丑陋。我把它抽象成一个for循环。

我的版本:

prefix = 'hello0'
extensions = ('.abc', '.def', '.ghi')  # there could be even more than this
condition = True
while condition:
    condition = False
    # if any of the paths still exist, set the condition back to True
    for extension in extensions:
        if os.path.exists(prefix + extension):
            condition = True

    n = int(prefix[-1])
    prefix = prefix[:-1] + str(n + 1)

我仍然觉得这有点笨拙:while循环实际测试的内容并不完全清楚。是否可以动态构建布尔表达式,而不是设置布尔

我认为以下可能有效(我没有测试过,我只是在写这篇文章时才想到它!)但我认为我不应该求助于eval

prefix = 'hello0'
extensions = ('.abc', '.def', '.ghi')

test = 'False'
for extension in extensions:
    test += " or os.path.exists(prefix + '" + extension + "')"
while eval(test):
    n = int(prefix[-1])
    prefix = prefix[:-1] + str(n + 1)
4

1 回答 1

9

您可能希望将any()内置与生成器一起使用:

while any(os.path.exists(prefix + extension) for extension in extensions):

    # then increment prefix and try again, as in your example code

这会使用更简单的语法计算您需要的Trueor False

一般来说,如果我曾经有过使用像 Python 这样的动态语言的诱惑eval(),那么这意味着我需要学习一个重要的语言特性。动态语言应该使代码更漂亮,而不会尝试编写和维护写更多代码的代码——所以你在这里通过询问你的方法做了完全正确的事情。

于 2012-09-19T15:32:07.943 回答