首页 > 解决方案 > 如何重命名排序列表中的文件?

问题描述

我有一堆编号为 1-20 的文件(结果 1.pdf,结果 2.pdf ......等),我正在尝试使用包含的序列号重命名它们(结果 1 = 输出 300,结果 2 = 输出 301...)。

当我尝试重命名这些文件中的 20 个时,它们的排序如下:结果 1、结果 10、结果 11 等。我有一些代码可以自然地对这些文件进行排序并将名称存储在列表中:

import natsort
from natsort import natsorted, ns

path = os.getcwd() + "/"
raw_list = [_ for _ in os.listdir(path) if _.endswith(".pdf")]
sorted_list = natsorted(raw_list, key = lambda y: y.lower())

当我 printsorted_list时,它会返回一个文件名列表,这些文件名按照我想要的方式排序(耶!)。

我还有使用用户输入的一些信息重命名文件的代码:

def rename():
    global i
    for filename in sorted_list:
        if ".pdf" in filename:
            my_dest = str(user_inp_1) + " " + str(user_inp_2).zfill(4) + ".pdf"
            my_source = path + filename
            my_dest = path + my_dest
            os.rename(my_source, my_dest)
            i = i + 1

    messagebox.showinfo("Success", "All files have been renamed successfully!")

这曾经适用于未排序的文件,但我不确定如何使其适用于排序列表。有什么我想念的吗?

编辑:我向同事展示了脚本,我们最终重写了整个事情......我摆脱了全局变量和其他此类非 pythonic 的东西。

标签: pythonsortingrename

解决方案


如果我做对了,你只需要像这样重命名文件:

结果 1.pdf -> 输出 300.pdf ... 结果 20.pdf -> 输出 319.pdf

我会将数字解析为 int a add 299。

from pathlib import Path
fpaths = Path().glob("Result*.pdf")

for f in fpaths:
    no = int(f.stem.rsplit(" ", 1)[-1])
    new_name = f"Output {no + 299}.pdf"
    print(f"rename {f} -> {new_name}")
    f.rename(new_name)  # comment this out for dry run

推荐阅读