Python编写的 可 生成编码 识别PDF页数 计算价格的小程序

编写它的目的是为了方便工作

这个工作的大概流程是,客户在网络上将要打印的论文以PDF格式发给我,我会用此程序生成一个编号,生成一个以此编号命名的文件夹,用于保存PDF文件,防止后续出问题无处溯源。
最后的文件目录形式为:…\May-23\编号

开始运行时,会询问使用的机器代码,使用者姓名
在这里插入图片描述
输入完基本信息并回车后,会在程序所在目录生成以当前日期命名的文件夹,同时生成用于记录操作的txt文件

# ----------------主程序---------------#
import time
print(
    '''
    ------------------------------
    会自动生成以编号命名的文件夹
    请将要打印的文件放入相应的文件夹中
    从南到北 机器码分别为 1 2 3
    ------------------------------
    '''

)
M_number = input("请输入您使用的机器代码:")
user_n = input("请输入您的名字:")
a = time.gmtime()
b = time.ctime().split()
mon = b[1]
day = b[2]
folder_name = mon+"-"+day
mkdir(folder_name)                      #创建一级目录
f = open(folder_name+"\\"+"numbers.txt","a+")
f.write("000000{}\n".format(user_n))
f.close()

在这里插入图片描述
回车后,程序会生成一段编码,并在当天日期的文件夹中创建以编码为名字的文件夹

编码组成为 : 机器码/小时(24h制)/分钟/区别码
区别码用于防止在极短时间内生成两个编号带来的麻烦,如果前几位重复,则会从0开始累加,防止最后一位重复

for i in range(1000000):   #懒得改了,,,
    continue_q = input("是否继续?(回车继续/输入n停止/b回退到上一次/j计算器模式):")
    if continue_q in ["n", "N"]:
        print("程序结束--爱吃鲨鱼的猫")
        time.sleep(3)
        break
    elif continue_q in ["B","b"]:
        if pdf_a("\\"+folder_name+"\\"+str(daima)+"\\") == 1:   #判断文件页数
            continue
    elif continue_q in ["J","j"]:
        a = input("请输入要计算的公式:")
        try:
            print(eval(a))
        except:
            print("请输入正确的运算公式!")
        continue
    else:
        a = time.gmtime()
        # number_name_a = M_number + str(a.tm_hour + 8) + str(a.tm_min)
        if a.tm_hour >= 16:        # 用于纠正时区错误
            hour = a.tm_hour - 16
        else:
            hour = a.tm_hour + 8
        number_name_a = "{}{:0>2}{:0>2}".format(M_number,str(hour),str(a.tm_min))  # 产生初级编码,小时+8是因为中国在东八区, 生成编码时,会在此编码后加上区分码
        daima = mknumber(number_name_a, folder_name)                             # 产生高级代码
    while True:
        if pdf_a("\\"+folder_name+"\\"+str(daima)+"\\") == 1:   #判断文件页数
            break

在这里插入图片描述
numbers.txt中会记录一些信息
在这里插入图片描述
记录生成的编号

本是为了后期好统计每个时间段工作的频率,后来为了满足追踪个人绩效的需求,就在此基础上增加了记录使用者的名字,这样以来就可以知道,工作是谁做的了

将PDF文件放入相应编号的文件夹中时,程序会自动读取PDF文件的页数(用PyPDF2库实现),计算总金额

def pdf_a(lujing):  #检测文件是否存在,并返回总页数
    from PyPDF2 import  PdfFileReader
    import os
    # 检测文件存在
    a_1 = os.getcwd()   #获取当前路径
    lujing1 = a_1+lujing
    a0 = os.listdir(lujing1)  #获取文件夹内容
    a = []
    for i in a0:           #去除非PDF文件
        if i[-3:]=="pdf":
            a.append(i)
    # a = [i for i in a0 if leixing(a0,"pdf")==1]
    # print(a)
    if a ==[]:
        # print("\r未检测到文件,等待---",end="")
        dengdai('未检测到PDF文件,等待')
        return 0
    else:
        print("\r检测到PDF文件",end="")
        page = 0
        work = []
        for i in a:
            o_file = open(a_1 + lujing + i, 'rb')
            input1 = PdfFileReader(o_file)
            print("{}".format(i) + "的页数:" + str(input1.getNumPages()))
            page = page + input1.getNumPages()
            # input1 = PdfFileReader(open("example.pdf", "rb"))
        print("*" * 15)
        print("{}个文件,共计:".format(len(a)) + str(page) + "页")
        print(str(page) + "-75={},需支付:{:.2f}元".format(page - 75, (page - 75) * 0.2))
        print(str(page) + "-65={},需支付:{:.2f}元".format(page - 65, (page - 65) * 0.2))
        print(str(page) + "自费,需支付:{:.2f}元".format(page * 0.2))
        print("*" * 15)
        o_file.close()
        return 1
    return 0

因为这个工作中涉及两种优惠政策,所以会输出减去75页和减去65页后的金额,为了减少使用时操作程序的次数,我选择让使用者自行判断

程序提供了四种选择
在这里插入图片描述
回车和N就不用说了
b是重新判断上一次产生的文件夹中的文件(多个pdf文件有可能被一个一个被拖进文件夹,但程序在第一个pdf文件被拖进去时就会输出结果,为了解决此问题,给予使用者这个选择)
j 就是简单的使用eval()实现的计算器小工具

完整代码:

def mkdir(path):    #创建目录
    import os       # 引入模块
    isExists = os.path.exists(path)
    if not isExists:       # 如果不存在则创建目录
        os.makedirs(path)  # 创建目录操作函数
        return True
    else:                   # 如果目录存在则不创建,并提示目录已存在
        return False
def dengdai(a):
    import time
    for i in range(5):
        time.sleep(0.3)
        print("\r"+a +"*"*i,end="")
def mknumber(number,folder_name):        #生成编码, 并创建文件夹
    f = open(folder_name+"\\"+"numbers.txt")
    f1 = f.readlines()
    daima = " "
    print("-------------")
    if f1[-1].split()[0][:5]== number:
        qbm=str(int(f1[-1].split()[0][5:])+1)   #区别码
        f.close()
        f = open(folder_name + "\\" + "numbers.txt", "a+")   # 反复打开文件,是因为不这么做就会有BUG
        number = f1[-1].split()[0]
        f.write("{}\n".format(int(number[:5]+qbm)))
        print("您的代码为{}".format(number[:5]+qbm))
        daima = number[:5]+qbm
        f.close()
        mkdir(folder_name + "\\" +number[:5]+qbm)
    else:
        f = open(folder_name + "\\" + "numbers.txt","a+")
        f.write("{}\n".format(eval(str(number) + "0")))
        f.close()
        print("您的代码为:{}".format(str(number) + "0"))
        daima = str(number) + "0"
        mkdir(folder_name + "\\" + str(number) + "0")
    f.close()
    return daima
# def leixing(a,b):   #用于判断列表a中存储的文件名是否为b
#     for i in a:
#         if i[-3:] != b:
#             # print("\r检测到非PDF文件!请只保留PDF文件!",end="")
#             dengdai("检测到非PDF文件!请只保留PDF文件!")
#             return 0
#         else:
#             return 1
def pdf_a(lujing):  #检测文件是否存在,并返回总页数
    from PyPDF2 import  PdfFileReader
    import os
    # 检测文件存在
    a_1 = os.getcwd()   #获取当前路径
    lujing1 = a_1+lujing
    a0 = os.listdir(lujing1)  #获取文件夹内容
    a = []
    for i in a0:           #去除非PDF文件
        if i[-3:]=="pdf":
            a.append(i)
    # a = [i for i in a0 if leixing(a0,"pdf")==1]
    # print(a)
    if a ==[]:
        # print("\r未检测到文件,等待---",end="")
        dengdai('未检测到PDF文件,等待')
        return 0
    else:
        print("\r检测到PDF文件",end="")
        page = 0
        work = []
        for i in a:
            o_file = open(a_1 + lujing + i, 'rb')
            input1 = PdfFileReader(o_file)
            print("{}".format(i) + "的页数:" + str(input1.getNumPages()))
            page = page + input1.getNumPages()
            # input1 = PdfFileReader(open("example.pdf", "rb"))
        print("*" * 15)
        print("{}个文件,共计:".format(len(a)) + str(page) + "页")
        print(str(page) + "-75={},需支付:{:.2f}元".format(page - 75, (page - 75) * 0.2))
        print(str(page) + "-65={},需支付:{:.2f}元".format(page - 65, (page - 65) * 0.2))
        print(str(page) + "自费,需支付:{:.2f}元".format(page * 0.2))
        print("*" * 15)
        o_file.close()
        return 1
    return 0


# ----------------主程序---------------#
import time
print(
    '''
    ------------------------------
    会自动生成以编号命名的文件夹
    请将要打印的文件放入相应的文件夹中
    从南到北 机器码分别为 1 2 3
    ------------------------------
    '''

)
M_number = input("请输入您使用的机器代码:")
user_n = input("请输入您的名字:")
a = time.gmtime()
b = time.ctime().split()
mon = b[1]
day = b[2]
folder_name = mon+"-"+day
mkdir(folder_name)                      #创建一级目录
f = open(folder_name+"\\"+"numbers.txt","a+")
f.write("000000{}\n".format(user_n))
f.close()
for i in range(1000000):
    continue_q = input("是否继续?(回车继续/输入n停止/b回退到上一次/j计算器模式):")
    if continue_q in ["n", "N"]:
        print("程序结束--爱吃鲨鱼的猫")
        time.sleep(3)
        break
    elif continue_q in ["B","b"]:
        if pdf_a("\\"+folder_name+"\\"+str(daima)+"\\") == 1:   #判断文件页数
            continue
    elif continue_q in ["J","j"]:
        a = input("请输入要计算的公式:")
        try:
            print(eval(a))
        except:
            print("请输入正确的运算公式!")
        continue
    else:
        a = time.gmtime()
        # number_name_a = M_number + str(a.tm_hour + 8) + str(a.tm_min)
        if a.tm_hour >= 16:        # 用于纠正时区错误
            hour = a.tm_hour - 16
        else:
            hour = a.tm_hour + 8
        number_name_a = "{}{:0>2}{:0>2}".format(M_number,str(hour),str(a.tm_min))  # 产生初级编码,小时+8是因为中国在东八区, 生成编码时,会在此编码后加上区分码
        daima = mknumber(number_name_a, folder_name)                             # 产生高级代码
    while True:
        if pdf_a("\\"+folder_name+"\\"+str(daima)+"\\") == 1:   #判断文件页数
            break

最后使用了PyInstaller库将py程序打包成exe文件了
需要将PyPDF2库一并打包
我使用有效的代码是:pyinstaller -F 编号v1.1.2.py -p D:\anaconda3\envs\env_name\Lib\site-packages


我就是个大一的老工具人,头一次发博客(这是叫博客吧。。。)
请多指教!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值