6
8月
2025
批处理文件操作 - 重命名和合并 PDF
18:24

批处理文件操作 - 重命名和合并 PDF

6 8月 2025 18:24

我决定分享两个 Python 程序。 第一个是根据创建日期按序列号重命名文件。 第二种是按编号合并 PDF 文件。

工作任务是扫描用户手册的最后几页,其中标有序列号。 这样的文件共有 6 个。

成组的文档被手动放入编号为 01、02、03 等的文件夹中,直到最后一个。
一张纸 - 一个 PDF 文件。 然后将其中一些组合成两张纸。

文件夹01包含6个文件

  • 随机名称。 PDF
  • 随机名称。 PDF
  • 随机名称。 PDF
  • 随机名称。 PDF
  • 随机名称。 PDF
  • 随机名称。 PDF

任务:获取文件夹中的 01 设置
01_res1.pdf
01_res2.pdf
01_res3.pdf
01_res4.pdf

将任务分为两个子任务:

  • 遍历文件夹并按创建日期重命名文件 - 进入文件夹名称 + 序列号:01-1.pdf、01-2.pdf、01-3.pdf、01-4.pdf、01-5.pdf 和 01-6.pdf。
  • 根据算法合并文件: 3 和 4 合并为一个 PDF 文件,5 和 6 合并为另一个 PDF 文件。

第一个脚本 重命名文件.py 不仅适用于 PDF 格式的批量重命名文件,而且适用于任何格式的文件。
第二个脚本 组合文件.py 实现合并每个目录中的 PDF 文件的逻辑。


运行程序的输入参数- 父文件夹的名称(包含子文件夹 01、02、03 等)。

启动示例:

python rename_files.py /home/user/parent_folder
python combine_files.py /home/user/parent_folder

其中parent_folder 包含带有PDF 文件的文件夹01、02、03 等。

谨慎运行rename_files.py,不要在工作目录中,因为所有文件都会以批处理模式重命名,而不会出现提示。

rename_files.py 文件的内容:

# This script takes path to directory with set of subdirectories, numbered 01, 02, 03, ... etc.

并按照文件创建的顺序按照子目录名称和整数重命名子目录中的 PDF 文件。

示例:在脚本运行之前子目录 01 包含文件:random912371.pdf、random167722.pdf、random561724.pdf

脚本运行后,子目录 01 中的文件重命名为:01-1.pdf,

01-2.pdf, 01-3.pdf

导入操作系统
从 pathlib 导入路径
导入系统
导入路径库

def list_dirs(文件夹路径):
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isdir(file_path):
dir_path = file_path
print(f "Processing directory '{dir_path}'")
rename_files_with_creation_date(dir_path)
print("Done!")

def rename_files_with_creation_date(folder_path):

tpl =“{0}-{num:02d}"

tpl = "{0}-{num}" 
cnt = 1
folder_name = folder_path.split("/")[-1]
父文件夹名称 = os.path.split(文件夹路径)[-1]
os.chdir(folder_path)
files = filter(os.path.isfile, os.listdir(folder_path))  #仅获取文件
files = [os.path.join(folder_path, f)
         for f in files]  #将路径folder_path添加到每个文件f
files.sort(key=lambda x: os.path.getmtime(x))  #按创建时间排序

for filename in files:
    #print(f "{cnt}.重命名'{filename}'...")
    if os.path.isfile(filename):
        ext = pathlib.Path(filename).suffix
        new_name = tpl.format(folder_name, num=cnt) + ext
        filename_new = os.path.join(folder_path, new_name)
        if (filename != filename_new):
            print(f "Ranaming '{filename}' to '{filename_new}'")
            if not os.path.isfile(filename_new):
                os.rename(filename, filename_new)
                #打印(“确定”)
            else:
                print(f "File '{filename_new}' exists, skipping.")
        cnt = cnt + 1

如果 name == "main":
if len(sys.argv) == 2:
folder_path = sys.argv[1]
其他:
folder_path = input("Enter the folder path: ")
list_dirs(folder_path)

除了组合之外,combine_files.py 文件还实现了从纵向视图到横向视图(90 度)的页面旋转。 可以通过编辑脚本的源文本来删除此转换。

# This script combines files

导入操作系统
导入系统
导入路径库
导入日志记录
导入线程
导入时间
从 pathlib 导入路径
从子进程导入 PIPE,运行

def list_dirs(文件夹路径):
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isdir(file_path):
dir_path = file_path
print(f "Processing directory '{dir_path}'")
combine_files(dir_path)
print("Done!")

def组合文件(文件夹路径):
folder_name = folder_path.split("/")[-1]
parent_folder_name = os.path.split(folder_path)[-1]
os.chdir(folder_path)
files = filter(os.path.isfile, os.listdir(folder_path))
files = sorted(files)

cnt = 1
for filename in files:
    full_name = os.path.join(folder_path, filename)
    if (filename == parent_folder_name + "-1.pdf"):
        suffix = "_res1.pdf" 
        new_name = folder_name + suffix
        cmdstr = "qpdf " + full_name + " " + new_name + " --rotate=+90" 
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-2.pdf"):
        suffix = "_res2.pdf" 
        new_name = folder_name + suffix
        new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf " + full_name + " " + new_name + " --rotate=+90" 
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-3.pdf"):
        suffix = "_res3.pdf" 
        new_name = folder_name + suffix
        full_new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf --empty --pages " + full_name + " " + \
            full_name.replace("3.pdf", "4.pdf") + " -- --rotate=+90 " + full_new_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-4.pdf"):
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-5.pdf"):
        suffix = "_res4.pdf" 
        new_name = folder_name + suffix
        full_new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf --empty --pages " + full_name + " " + \
            full_name.replace("5.pdf", "6.pdf") + " -- --rotate=+90 " + full_new_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-6.pdf"):
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))

如果 name == "main":
if len(sys.argv) == 2:
folder_path = sys.argv[1]
else:
folder_path = input("Enter the folder path: ")
list_dirs(folder_path)

包含 2 个程序的存档:
按创建日期和组合重命名文件.zip

我从这里开始重命名文件的想法: GitHub - 按创建日期重命名文件,但文件名的格式为 Day_Month_Year_Hour_Minute_Second,并且我有 FOLDER_NAME-sequence_number。



相关出版物