文件夹下全是案卷的扫描的PDF扫描件,现在要根据扫描的PDF页数向第三方服务公司支付扫描费用,但是怎么计算文件夹下的pdf文件总页数呢?总不能一个个打开看页码数吧。
百度了以下,万能的PYTHON果然有一个PYPDF2的库,顺利搞定
实现功能,对当前文件夹的PDF文件进行遍历,并统计问价总页数。
知识点1:如何对当前文件夹进行遍历
知识点2:如何用PYPDF2统计文件页数
一、安装库
pip install PyPDF2
二、代码
import os
import time
from PyPDF2 import PdfFileReader
def folder_pdf_files(): #遍历一个文件夹里的pdf文件
file_list = []
path = r"."
for a, b, c in os.walk(path):
#print(b)
for filename in c:
if filename[-4:].lower() == '.pdf':
# print(filename)
file_path = os.path.join(a, filename)
file_list.append(file_path)
print(f"在当前路径下{len(file_list)} 有个pdf文件")
return file_list
def get_num_pages(pdf):
page_num = 0
reader = PdfFileReader(pdf,strict=False)
if reader.isEncrypted:
return 0
else:
page_num = len(reader.pages)
return page_num
if __name__ == '__main__':
nums = 0
i = folder_pdf_files()
for pdf in i:
print(pdf)
nums = nums +get_num_pages(pdf)
print(f"该文件夹内pdf文件共有{nums}页")
time.sleep(10)
三、生成exe
(一)安装
pip install pyinstaller
(二)生成
pyinstaller -F x:\\xxx\xxx.py # x:\\xxx\xxx.py 是代码存储地址
最后,本着懒人推动科技进本的原则,对这段代码生成了exe文件,供大家交流学习。
链接:链接:https://pan.baidu.com/s/1OMHeEDdeQz1G-K4NEd9JtQ?pwd=4444
提取码:4444
四、主要改进内容
1.网上可以找到的代码,使用的都是PyPDF2库,
reader = PdfFileReader(pdf)
num_page = reader.getNumPages()
reader.getNumPages()方法,但在阅读PyPDF2库文档后,该方法虽然能够正常使用,但是已经弃用。
“
1.28.0 版后已弃用:改为使用len(reader.pages)
”
我使用了推荐的len(reader.pages)方法来统计页数
2.在统计过程中,我发现我有一个文件夹名字为“pdf”,统计时出现异常
分析代码
if filename[-3:].lower() == 'pdf':
ilename[-3:].lower() == 'pdf' 这句错了
修改了一下
if filename[-4:].lower() == '.pdf':
虽然如果出现“.pdf”这样的文件夹,程序仍然会报错,但是我想正常人一般不会给文件夹起这样的名字,所以也就不再修改了。
五、待完善
1.在实际使用中发现,需要统计的文件数量太大40w+,且硬盘不是固态硬盘,读写速度非常慢,统计时间太长,如果使用多进程、线程是否可以提高速度?
2.统计界面不友好,DOS界面,结果只保存10s,容易错过,应当改写消息弹窗,更为友好。
六、多进程
import os
import time
from tkinter import N
from PyPDF2 import PdfFileReader
#导入多进程模块
from threading import Thread
li = [0,0,0]
def open_file(i,lock):
with lock:
with open("ip.txt" ,"a" ,encoding="utf-8") as f:
f.write(f"{i}\n")
def folder_pdf_files(): #遍历一个文件夹里的pdf文件
file_list = []
path = r"."
for a, b, c in os.walk(path):
#print(b)
for filename in c:
if filename[-4:].lower() == '.pdf':
# print(filename)
file_path = os.path.join(a, filename)
file_list.append(file_path)
print(f"在当前路径下{len(file_list)} 有个pdf文件")
return file_list
def get_num_pages(pdf): #获取pdf文件页数
page_num = 0
reader = PdfFileReader(pdf,strict=False)
if reader.isEncrypted:
return 0
else:
page_num = len(reader.pages)
return page_num
def pdfs_nums(pdfs,i): #获取pdf文件list内总页数
num = 0
global li
for pdf in pdfs:
num += get_num_pages(pdf)
if i%3 == 0:
li[0] = num
elif i%3 == 1:
li[1] = num
else:
li[2] = num
print(li)
print(f"{i} 的页数是 {num}")
return num
def pr():
time.sleep(6)
print(li)
if __name__ == '__main__':
i = 0
pdf1,pdf2,pdf3 = [],[],[]
folder = folder_pdf_files()
for pdf in folder:
if i%3 == 0:
pdf1.append(pdf)
elif i%3 == 1:
pdf2.append(pdf)
else:
pdf3.append(pdf)
i += 1
for i in range(3):
if i == 0:
t1 =Thread(target=pdfs_nums, args=(pdf1,i))
t1.start()
elif i == 1:
t2 =Thread(target=pdfs_nums, args=(pdf2,i))
t2.start()
else:
t3 =Thread(target=pdfs_nums, args=(pdf3,i))
t3.start()
t1.join()
t2.join()
t3.join()
total = li[0] + li[1] + li[2]
print(f"总页数是 {total}")
这下尴尬了,用time.perf_counter()测试了下,多线程和非多线程,用时几乎一致,没有明显提高速度,这又是为什么呢?
如果代码对您的工作给予了帮助,节省了您的时间,还请老板打个赏,让我再这炎炎夏日里能买杯蜜雪冰城喝喝。