在 Python 中重命名文件时如何停止命名冗余?

How can I stop naming redundancies while renaming files in Python?

我正在尝试使用 Python 重命名一组 .txt 文件。我可以成功地将文件重命名为新的所需命名约定,但如果脚本多次获得 运行 或者如果目录中的某些文件已经使用正确的命名约定,文件名开始变得多余。到目前为止,这是我在这个过程中的代码。

os.chdir('C:\Users\Phillip\Circuit_generation\Automation\Test_files\')
sc_files = glob.glob('*sc.txt')
print('All netlist files ending with a series capacitor:')
for file_name in sc_files:
    order = int(file_name.count('sc') + file_name.count('sl') + file_name.count('pc') + file_name.count('pl'))
    old_name = file_name
    new_name = 'Order_{}_{}'.format(order, old_name)
    if os.path.isfile(new_name):
        pass
    else:
        os.rename(old_name, new_name)
    print(new_name)

脚本正在搜索目录并查找以特定文本结尾的所有文件。然后我尝试遍历所有符合该条件的文件。计算电路的阶数。我记录当前文件名然后定义一个新名称。

我想要的是以这样一种格式结束文件:

Order_5_sc_pl_sl_pc_sc

但是,如果此脚本 运行 不止一次或文件已经符合此命名约定,我将开始获取文件名,例如:

Order_5_Order_5_sc_pl_sl_pc_sc

Order_5_Order_5_Order_5_sc_pl_sl_pc_sc

我已经尝试检查旧名称是否与新命名约定匹配,如果名称已经是正确的格式则通过,但我无法解决问题。这段代码是我最近尝试阻止文件被错误命名的尝试。我认为这次尝试失败了,因为我并没有真正允许旧名称与新名称匹配,但我似乎找不到解决方案。我也尝试了以下但得到了类似的结果:

print('All netlist files ending with a series capacitor:')
for file_name in sc_files:
    order = int(file_name.count('sc') + file_name.count('sl') + file_name.count('pc') + file_name.count('pl'))
    old_name = file_name
    if os.path.isfile('Order_{}_{}'.format(order, old_name[8:])):
        pass
    else:
        new_name = 'Order_{}_{}'.format(order, old_name)
        os.rename(old_name, new_name)
    print(new_name)\

我怎样才能只重命名需要重命名的文件,而不是继续创建冗长的冗余文件名?我不确定我做错了什么,非常感谢对此事的任何帮助。谢谢。

您能否提供一些您开始使用的文件名示例,以便我们帮助您?另外,请不要使用格式功能,现在大多数人都在使用 f-strings,而 "" 仅用于将多行合并为一行。

根据我从你的问题中得到的,这就是我想出的。我的代码的一个副作用可能是订单的顺序可以更改,即:“sc_pl_sl_pl_sc”到“Order_sc_pl_pl_sl_sc”

import os

def get_all_orders(file_name):
    all_orders = []
    orders_amount = 0
    order_types = {"pl", "sl", "pc", "sc"}
    for order_type in order_types:
        order_type_amount = file_name.count(order_type)
        all_orders += [order_type] * order_type_amount
    return orders_amount, all_orders


for file_name in ["Order_5_sc_pl_sl_pc_sc", "sc_pl_sl_pc_sc"]:
    if "Order_" not in file_name:
        orders_amount, all_orders = get_all_orders(file_name)
        new_filename = "Order_" + "_".join(all_orders)
        if not os.path.isfile(new_filename):
            # os.rename(file_name, new_name)
            print(f"os.rename({file_name}, {new_filename})")