可能需要的库:

from PyPDF2 import PdfFileReader, PdfFileWriter
import os
import pandas as pd 
import shutil
import re

若没有自行 pip install

==========================

在此文中 你可以得到的封装方法有:

1.根据任意页数平均拆分一个PDF文件

pdf_input  ='大文件路径'
path_output='输出拆分文件的路径'
num_file   =要拆成几份pdf(数字)
num_page   =每份pdf平均几页(数字)
def pdf_split_3(pdf_input, path_output, num_file, num_page):
    fname = os.path.splitext(os.path.basename(pdf_input))[0]  # 获取文件名,不含后缀名

    for i in range(num_file):  #num_file要拆分的文件数
        with open(pdf_input, 'rb') as open_pdf:  # rb二进制打开读取,wb二进制打开写入
            pdf_reader = PdfFileReader(open_pdf)
            pdf_writer = PdfFileWriter()
            
            if (i+1)*num_page <= pdf_reader.numPages:
                for page in range(i*num_page, (i+1)*num_page):
                    pdf_writer.addPage(pdf_reader.getPage(page))
               # output_filename = path_output + r'\{}{}.pdf'.format(fname,i+1)
                output_filename = path_output + r'\{}{}.pdf'.format(fname,i+1)
                # output_filename = os.path.join(path_output, '{}_{}.pdf'.format(fname,i+1))  # 等价

            else:
                for page in range(i*num_page, pdf_reader.numPages):
                    pdf_writer.addPage(pdf_reader.getPage(page))
              #  output_filename = path_output + r'\{}_{}.pdf'.format(fname,i+1)
                output_filename = path_output + r'.pdf'.format(fname,i+1)
                # output_filename = os.path.join(path_output, '{}_{}.pdf'.format(fname,i+1))  # 等价

            with open(output_filename, 'wb') as out:
                pdf_writer.write(out)
    print('拆分成功!!')

2.批量删除文件名中的任意字符

dirPath =需要批量修改的文件目录
pattern='需要删去的字符'(记得加引号)
def Delet_File_Name(dirPath,pattern):
    """
    :param dirPath: 文件夹路径
    :param pattern: 正则匹配模式
    :return:
    """
    # 对目录下的文件进行遍历
    for file in os.listdir(dirPath):
        # 判断是否是文件
        if os.path.isfile(os.path.join(dirPath, file)) == True:
            # 用正则匹配,去掉不需要的词
            newName = re.sub(pattern, "", file)
            # 设置新文件名
            newFilename = file.replace(file, newName)
            # 重命名
            os.rename(os.path.join(dirPath, file), os.path.join(dirPath, newFilename))
    print('文件名中的['+pattern+']已删除成功')

3.将文件列表以阿拉伯数字重排序

仅适用于文件名仅为阿拉伯数字的情况
做这一步的目的是,python获取的文件List默认以(1,10,11,12…,2,20)的顺序进行排序
此方法重新调整获取到的文件名顺序为(1,2…10,11,12)

若不进行此步重排序 第4步的改名会因乱序导致错误

PS:方法中的新文件名可以进行自由修改,这里默认《segment+新序号》

dirPath='文件目录'
# 重新调整文件名顺序为(1,2…10,11) 而不是Python默认的(1,10,11,12…,2,20)
def reorder_File_Name(dirPath):
    fileList=os.listdir(dirPath)
    #get_key是sotred函数用来比较的元素,该处用lambda表达式替代函数。
    get_key = lambda i : int(i.split('.')[0])
    new_sort = sorted(fileList, key=get_key)
    #print(fileList, '\n', new_sort)
    n = 0

    for i in fileList:
        # 设置旧文件名(就是路径+文件名)
        oldname = dirPath + os.sep + new_sort[n]  # os.sep添加系统分隔符
        # 设置新文件名
        newname = dirPath + os.sep + 'segment' + str(n + 1)+'.pdf'
        os.rename(oldname, newname)  # 用os模块中的rename方法对文件改名
        # print(oldname, '   ======>  ', newname)
        n += 1
    print("文件名重排序成功,目前均为 [segment+序号]")

4.根据Excel两列数据批量修改文件名(oldname、newname)

其中excel中的数据要这样:在这里插入图片描述

excelname=存有新老文件名的excel路径
dirPath  =老文件们所在的目录
def rename_according_to_xlsx(excelname, dirPath):
    data = pd.read_excel(excelname, sheet_name='Sheet1')  # 读取同一个表格中指定 Sheet1 中的数据,不指定时直接默认读取到这个Excel的第一个表单
    # 遍历该文件夹所有的文件,并for循环
    for name in os.listdir(dirPath):
        # 文件名加上文件夹构成绝对路径
        before_file = os.path.join(dirPath, name)
        # 获取当前文件名所在行
        index = data.loc[data['oldname'] == name]
        # print("2=", index)
        # 当前文件所对应的新名称
        new_name = index['newname'].values

        if len(new_name):
            # index['code'].values 为当前文件名所对应的新名称
            after_file = os.path.join(dirPath, new_name[0])

            # 利用shutil.move将文件移动到原来位置(重命名的效果)
            shutil.move(before_file, after_file)
        else:
            break
    print("根据excel内容所有文件名称修改完成!!!")

写在最后:上面的每一个方法都可以独立使用,按序使用则可以解决“拆分-对拆分后的文件重命名”

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐