将输出文件名相应地更改为文件夹中的先前文件版本

时间:2019-06-25 10:59:00

标签: python python-os

在Python脚本中,我创建一个输出文件。 我希望其名称相应地更改为输出文件夹中的旧版本。 例如:

output_file_name = 'output.txt'
if output.txt already exists --> output_file_name = output_(2).txt
if output_(2).txt already exists --> output_file_name = output_(3).txt
...

我的审判:

import os.path
def check_versions(last_version_filename):
    # if an output_file_name_(n).txt is present then
    # return output_file_name(n+1).txt

    #extract the version of the file inside the output folder
    try:
        old_version = last_version_filename.split('(')[1].split(')')[0]

    # case in which no output_(n).txt version are present
    except IndexError:
        old_version = 1

    if old_version == 1:
        to_be_replaced = '.txt'
    else:
        to_be_replaced = '_({}).txt'.format(old_version)

    new_version = int(old_version) + 1
    last_version_filename = last_version_filename.replace(to_be_replaced,'_({}).txt'.format(new_version))


OUTPUT_FILE_NAME = 'output.txt'

# if output.txt file already exists, then we need to modify its name
if os.path.isfile('./' + OUTPUT_FILE_NAME):

    # last_file_version is the name of the last version file in the folder 
    OUTPUT_FILE_NAME = check_versions(last_version_filename)

那么我如何检查文件夹中文件的最新版本?考虑其格式将始终为output_(n).txt。因此,最大的n确定了最后的文件版本。

此外,此代码的主要缺陷是如果...

output.txt
output_(2).txt
.
.
.
output_(n).txt

全部存在。但是,如果缺少output.txt,代码将创建output.txt作为最新版本的输出文件。因此,您将拥有比output.txt更新的output_(2).txt。这可能会导致棘手。

同样,很显然我需要知道哪个是最新版本,然后相应地命名输出文件。

您将如何解决?

1 个答案:

答案 0 :(得分:1)

您可以对目录中符合您的模式的文件名进行排序,然后在最后一个文件名中添加一个:

import os
import re

valid_filenames = [filename for filename in os.listdir(os.curdir) if filename.startswith('output_')]

n_valid = len(valid_filenames)

if n_valid == 0:
    if os.path.isfile('output.txt'):
        next_filename = 'output_(2).txt'

    else:
        next_filename = 'output.txt'

else:
    regex = re.compile(r'\((\d+)\)')
    tagged_filenames = sorted((int(regex.search(filename).group(1)), filename) for filename in valid_filenames)
    next_filename = f'output_({int(tagged_filenames[-1][0]) + 1}).txt'