为文件名添加编号

Add numbering to file name

我是 Python 新手。我有一个包含数百个文件的目录。我想在每个文件的开头添加一个递增的数字,例如:001_filename 等等......我想用三位数字来编号。感谢那些能帮助我的人!

以下 Python 脚本重命名给定目录中的所有文件。

说明

它首先检查提供的路径是否真的是一个目录,是否存在。如果不是,它会打印一条错误消息并使用 non-zero 退出代码离开程序。

否则,它会检索该目录中的所有文件名,并根据文件的最后修改 日期对文件进行排序。您可以通过为 sorted()key= 参数提供另一个 lambda 函数来轻松调整排序标准。这实际上不是必需的,但由于 os.listdir() 以您的文件系统确定的顺序获取结果,这是确保根据您指定的标准重命名的唯一方法。

之后它确定用唯一ID唯一标识每个文件所需的位数。这将确保即使目录中有超过 数百个 的文件(如您的情况),脚本也能正常工作。 为了通过使用 max() 来回答您的问题,我确保它始终至少为三位数字,即使不需要它们来唯一标识文件。
如果有必要,它最终会重命名该文件,即该文件还没有所需的文件名。

脚本

import os
import sys

dir = "mydir"
if not (os.path.exists(dir) and os.path.isdir(dir)):
    # write error message to stderr
    print(f"Directory {dir} does not not exist or is not a directory.", file=sys.stderr)
    # exit program with exit code 1 indicating the script has failed
    sys.exit(1)
# get all files in the directory and store for each file it's name and the full path to the file
# This way we won't have to create the full path many times
my_files = [(file, os.path.join(dir, file)) for file in os.listdir(dir) if os.path.isfile(os.path.join(dir, file))]
# sort by "modified" timestamp in reverse order => file with most recent modified date first
# we need to use the fullpath here which is the second element in the tuple
sorted_by_creation_date = sorted(my_files, key=lambda file: os.path.getmtime(file[1]), reverse=True)
# get number of digits required to assign a unique value
number_of_digits = len(str(len(my_files)))
# use at least 3 digits, even if that's not actually required to uniquely assign values
number_of_digits = max(3, number_of_digits)

# loop over all files and rename them
print("Renaming files...")
for index, (file, fullpath) in enumerate(my_files):
    # rename files with leading zeros and start with index 1 instead of 0
    new_filename = f"file{index + 1}.txt"#f"{index + 1:0{number_of_digits}d}_{file}" #f"file{index + 1}.txt"
    if new_filename == file:
        # move on to next file if the file already has the desired filename
        print(f"File already has the desired filename {file}. Skipping file.")
        continue
    # concatenate new filename with path to directory
    new_name = os.path.join(dir, new_filename)
    # rename the file
    print(f"{file} => {new_filename}")
    os.rename(fullpath, new_name)

print("Done.")

如果你想 运行 使用 python myscript.py 某个目录中的脚本并重命名该目录中的文件,你可以使用 dir = os.getcwd() 获取脚本中的当前工作目录而不是像上面的脚本那样硬编码目录 (dir = "mydir").

此实现不会重命名嵌套目录中的文件,但您可以根据需要调整程序来执行此操作。在那种情况下可能想看看 os.walk()

示例

这样的目录示例:

Note: this uses the script from above with the hard-coded directory name mydir.

mydir/
├── file1.txt
├── file2.txt
├── file3.txt
└── Test
    └── test.txt

运行脚本

python myscript.py

脚本输出

Renaming files...
file1.txt => 001_file1.txt
file2.txt => 002_file2.txt
file3.txt => 003_file3.txt
Done.

结果

mydir/
├── 001_file1.txt
├── 002_file2.txt
├── 003_file3.txt
└── Test
    └── test.txt

如您所见,文件已按预期重命名,嵌套目录保持不变。