为文件名添加编号
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
如您所见,文件已按预期重命名,嵌套目录保持不变。
我是 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
如您所见,文件已按预期重命名,嵌套目录保持不变。