统计当前文件夹下pdf文件的页码总数
文件夾下全是案卷的掃描的PDF掃描件,現在要根據掃描的PDF頁數向第三方服務公司支付掃描費用,但是怎么計算文件夾下的pdf文件總頁數呢?總不能一個個打開看頁碼數吧。
百度了以下,萬能的PYTHON果然有一個PYPDF2的庫,順利搞定
實現功能,對當前文件夾的PDF文件進行遍歷,并統計問價總頁數。
知識點1:如何對當前文件夾進行遍歷
知識點2:如何用PYPDF2統計文件頁數
一、安裝庫
pip install PyPDF2二、代碼
? import os import time from PyPDF2 import PdfFileReaderdef 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_listdef get_num_pages(pdf):page_num = 0reader = PdfFileReader(pdf,strict=False)if reader.isEncrypted:return 0else:page_num = len(reader.pages)return page_numif __name__ == '__main__':nums = 0i = 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庫文檔后,該方法雖然能夠正常使用,但是已經棄用。
“
getNumPages?(?)?→?int[資源]?
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 Threadli = [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_listdef get_num_pages(pdf): #獲取pdf文件頁數page_num = 0reader = PdfFileReader(pdf,strict=False)if reader.isEncrypted:return 0else:page_num = len(reader.pages)return page_numdef pdfs_nums(pdfs,i): #獲取pdf文件list內總頁數num = 0global lifor pdf in pdfs:num += get_num_pages(pdf)if i%3 == 0:li[0] = numelif i%3 == 1:li[1] = numelse:li[2] = numprint(li)print(f"{i} 的頁數是 {num}")return numdef pr():time.sleep(6)print(li)if __name__ == '__main__':i = 0pdf1,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 += 1for 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()測試了下,多線程和非多線程,用時幾乎一致,沒有明顯提高速度,這又是為什么呢?
如果代碼對您的工作給予了幫助,節省了您的時間,還請老板打個賞,讓我再這炎炎夏日里能買杯蜜雪冰城喝喝。
總結
以上是生活随笔為你收集整理的统计当前文件夹下pdf文件的页码总数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 代码重构 pdf_《重构:改善
- 下一篇: C++奥赛第四弹——阿克曼函数