帮你自动化办公的python - 自动提取pdf指定页(文件处理篇)

概述

本文主要阐述在项目《自动提取pdf指定页》中文件的处理方式。若对项目需求不清楚的用户,请先查看文章《帮你自动化办公的python - 自动提取pdf指定页(项目概述)》。

介绍

python中用于处理文件和目录的模块较多,有os, os.path , shutil 等,本项目主要用到了os和shutil模块,涉及到了文件和目录的一些基本操作,将其抽象成基本类,并根据项目需求,封装了文件处理的一些相关方法。

核心

b_file类中方法基本都是调用现成模块实现,主要包含以下7大功能:

1. 删除文件和目录

    #删除文件,file:完整文件名(包含路径)
    def del_file(self, file):
        os.remove(file)

    #删除目录,dir:路径名
    def del_dir(self, dir):
        shutil.rmtree(dir)

2. 获取文件名和路径,以及文件全名拼接

    # 获取文件名,file:完整文件名(包含路径)     
    # 返回:名字(不含路径)
    def get_name(self, file):
        return os.path.basename(file)

    # 获取文件路径,file:完整文件名(包含路径)   
    # 返回:路径
    def get_path(self, file):
        return os.path.dirname(file)

    # 组合文件全名,name:文件名(不含路径)   path:路径      
    # 返回:完整文件名(包含路径)
    def combination_file(self, path, name):
        return os.path.join(path, name)

3. 打开和关闭文件

    # 以读取的方式打开文件,file:完整文件名(包含路径)      
    # 返回:文件描述符
    def open_read(self, file):
        return open(file, "rb")

    # 以写入的方式打开文件,file:完整文件名(包含路径)      
    # 返回:文件描述符
    def open_write(self, file):
        return open(file, "wb")

    # 关闭文件,fd:文件描述符
    def close(self, fd):
        fd.close()

4. 判断是否是文件或目录:

    # 判断文件是否是目录,file:完整文件名(包含路径)      
    # 返回:是目录返回True,否则False
    def is_dir(self, file):
        return os.path.isdir(file)

    # 判断文件是否是正常文件,file:完整文件名(包含路径)      
    # 返回:是文件返回True,否则False
    def is_file(self, file):
        return os.path.isfile(file)

5. 获取文件后缀

    # 获取文件后缀,name:文件名(不含路径)
    # 返回:文件后缀“.txt"、“.pdf"、".c"等,用来判断文件类型
    def get_suffix(self, name):
        return os.path.splitext(name)[1]

6. 移动文件

    #移动文件,src:源   dst:目标 (src和dst为完整文件名,包含路径)
    def mv_file(self, src, dst):
        shutil.move(src, dst)

7. 列出目录下所有文件

    # 列出目录下所有文件,包括文件夹,path:路径      
    # 返回:文件列表
    def ls_file(self, path):
        return os.listdir(path)

f_file对象调用b_file的方法,设计出本项目涉及到的文件操作,包含以下3大功能

1. 获取指定目录下所有指定类型文件,注意:这里遍历所有文件用到了递归调用。

    # 获取指定目录下所有指定类型文件,path:路径   suffix:后缀
    # all_files:用来存储符合指定后缀的文件列表
    #返回符合指定后缀的文件列表
    def get_type_files(self, path, suffix, all_files):
        file_list = self.ls_file(path)      # 获取当前目录所有文件及文件夹

        # 遍历当前目录所有文件及文件夹,文件直接处理,目录则递归调用处理
        for name in file_list:
            file = self.combination_file(path, name)    # 获取文件全名
            if self.is_dir(file):
                self.get_type_files(file, suffix, all_files)    # 递归处理子目录
            else:
                if self.get_suffix(name) == suffix:     # 后缀匹配一致,符合条件
                    all_files.append(file)

        return all_files

2. 根据文件名获取页码,文件名前两位数字代表页码

    # 获取文件页码,文件名前两位表示页码格式如(02赵明12月工资)
    # file:完整文件名    返回:-1表示页码不正确、否则页码正常
    def get_page(self, file):
        name = self.get_name(file)
        num_str = file[0:2]     # 取前两位,表示页码
        if not num_str.isdigit() or num_str == "" or int(num_str) < 1:
            return -1
        return int(num_str)

3. 获取真实文件名,去掉文件名前面页码之后的名字

    # 获取文件名,去掉文件名前两位表示页码后的名字,格式如(赵明12月工资)
    # file:完整文件名    返回:-1表示页码不正确、否则页码正常
    def get_new_file_name(self, file):
        name = self.get_name(file)
        new_name = name[2:]     # 去掉前两位(页码)
        return self.combination_file(self.get_path(file), new_name)

示例

★b_file对象(文件基本操作类):

属性:无

行为:包含打开文件、删除文件、关闭文件、打开目录、获取文件路径等。

★f_file对象(本项目中涉及到的文件操作类):

属性:无

行为:包含获取指定目录下所有指定类型文件、通过文件名获取文件页码、获取真实文件名。

 f_file.py

import os
import shutil

# 文件操作基类定义
class b_file(object):
    def __init__(self, _excel, _name):
        self.excel = _excel

    #删除文件,file:完整文件名(包含路径)
    def del_file(self, file):
        os.remove(file)

    #删除目录,dir:路径名
    def del_dir(self, dir):
        shutil.rmtree(dir)

    #移动文件,src:源   dst:目标 (src和dst为完整文件名,包含路径)
    def mv_file(self, src, dst):
        shutil.move(src, dst)

    # 获取文件名,file:完整文件名(包含路径)     返回:名字(不含路径)
    def get_name(self, file):
        return os.path.basename(file)

    # 获取文件路径,file:完整文件名(包含路径)   返回:路径
    def get_path(self, file):
        return os.path.dirname(file)

    # 组合文件全名,name:文件名(不含路径)   path:路径      返回:完整文件名(包含路径)
    def combination_file(self, path, name):
        return os.path.join(path, name)

    # 获取文件后缀,name:文件名(不含路径)      返回:文件后缀“.txt"、“.pdf"、".c"等,用来判断文件类型
    def get_suffix(self, name):
        return os.path.splitext(name)[1]

    # 判断文件是否是目录,file:完整文件名(包含路径)      返回:是目录返回True,否则False
    def is_dir(self, file):
        return os.path.isdir(file)

    # 判断文件是否是正常文件,file:完整文件名(包含路径)      返回:是文件返回True,否则False
    def is_file(self, file):
        return os.path.isfile(file)

    # 列出目录下所有文件,包括文件夹,path:路径      返回:文件列表
    def ls_file(self, path):
        return os.listdir(path)

    # 以读取的方式打开文件,file:完整文件名(包含路径)      返回:文件描述符
    def open_read(self, file):
        return open(file, "rb")

    # 以写入的方式打开文件,file:完整文件名(包含路径)      返回:文件描述符
    def open_write(self, file):
        return open(file, "wb")

    # 关闭文件,fd:文件描述符
    def close(self, fd):
        fd.close()

# 文件操作类定义
class f_file(b_file):
    def __init__(self):
        pass

    #获取指定目录下所有指定类型文件,path:路径   suffix:后缀    all_files:用来存储符合指定后缀的文件列表
    #返回符合指定后缀的文件列表
    def get_type_files(self, path, suffix, all_files):
        file_list = self.ls_file(path)      # 获取当前目录所有文件及文件夹

        # 遍历当前目录所有文件及文件夹,文件直接处理,目录则递归调用处理
        for name in file_list:
            file = self.combination_file(path, name)    # 获取文件全名
            if self.is_dir(file):
                self.get_type_files(file, suffix, all_files)    # 递归处理子目录
            else:
                if self.get_suffix(name) == suffix:     # 后缀匹配一致,符合条件
                    all_files.append(file)

        return all_files

    # 获取文件页码,文件名前两位表示页码格式如(02赵明(序号83)2019年12月工资发放凭证)
    # file:完整文件名    返回:-1表示页码不正确、否则页码正常
    def get_page(self, file):
        name = self.get_name(file)
        num_str = file[0:2]     # 取前两位,表示页码
        if not num_str.isdigit() or num_str == "" or int(num_str) < 1:
            return -1
        return int(num_str)

    # 获取文件名,去掉文件名前两位表示页码后的名字,格式如(02赵明(序号83)2019年12月工资发放凭证)
    # file:完整文件名    返回:-1表示页码不正确、否则页码正常
    def get_new_file_name(self, file):
        name = self.get_name(file)
        new_name = name[2:]     # 去掉前两位(页码)
        return self.combination_file(self.get_path(file), new_name)

往期 · 推荐

也没想象中那么神秘的数据结构-一种通用化的双向链表设计(底层源码)

也没想象中那么神秘的数据结构-一环扣一环的“链表”(双向链表)

我用C语言玩对象,框架化的模板模式

我用C语言玩对象,偷偷关注着你的观察者模式(基类设计)

我用C语言玩对象,独一无二的单例模式

关注

更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外你若想要本文章源码请关注公众号:不只会拍照的程序猿,后台回复:PDF拆解源码,也可点击此处下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不只会拍照的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值