2022年6月22日 星期三

python 只要點兩下,分別對各資料夾內的pdf合併,合併後的檔名要讓人知道來自哪個資料夾

系列文章:
        同事試用我的pdf合併程式後,覺得還不錯。但是緊接著說可不可以分別對各資料夾內的pdf合併,合併後的檔名要讓人知道來自哪個資料夾。我聽不太懂他的意思。請他說明他到底要做什麼?於是他說他掃描資料,經常要以資料夾做分類,每個資料夾內有各自的pdf。每次他掃描完後,還要用眼睛去看這些掃描檔,然後分類到每個資料夾。分類完後,還要一一對每個資料夾的pdf 合併。他現在想要的是,如果他將pdf 分類到不同的資料夾後,可不可以只要點兩下,那些各自資料夾的pdf合併,合併後的pdf 檔名可以讓他知道來自哪個資料夾。
        我聽懂他的意思,我開始將他的意思變更為:
如果Input資料夾內有01、02、03三個資料夾。
而資料夾01有兩個pdf,分別是011.pdf、012.pdf。                                  -->合併為01merge.pdf
而資料夾02有三個pdf,分別是021.pdf、022.pdf、023.pdf。                  -->合併為02merge.pdf
而資料夾03有四個pdf,分別是031.pdf、032.pdf、033.pdf、034.pdf。 -->合併為03merge.pdf
        我整理了他的需求:
         1.一個資料夾:這個資料夾可以讓他帶走
         2.資料夾內只有一個程式,對這個程式點兩下,合併的pdf就會出現
         3.資料夾內有個資料夾,其名稱叫Input,那他就會知道將很多的內含pdf的資料夾放進去
         4.不管放幾個內含pdf的資料夾 ,最後要能合併
         5.合併後的pdf 檔名要讓人看出,來自哪個資料夾
        換句話說,這個資料夾內有一個資料夾Input 與一個 exe (或者bat,讓他點兩下),然後就有各自資料夾名稱的合併pdf檔案。

        最後完成程式:
                                          下載檔案。解壓密碼:demo1234
教學影片:


        以下是程式原始碼的內容:
程式名稱:FolderPdfMerge.py
程式內容:
import os
from PyPDF2 import PdfFileMerger
pdf_dict = dict()
pdf_lst = list()
folder_lst = list()

# 設定Input為目標路徑
target_path=str(os.path.abspath(os.getcwd()))+'\\Input\\'
#output_path=str(os.path.abspath(os.getcwd()))+'\\Output\\'

#取得Input內各資料夾檔名
for f in os.listdir(target_path):
    if os.path.isdir(target_path+f):
        folder_lst.append(f)
    elif os.path.isfile(target_path+f):
        print("ERROR! There exist files")
        os.system("PAUSE")

#取得各資料夾檔名與資料夾內的各pdf檔名    
for path in folder_lst:
    for pdf in os.listdir(target_path+path):
        if pdf.endswith('.pdf'):
            pdf_lst.append(target_path+path+"\\"+pdf)
        pdf_dict[path] = pdf_lst
    pdf_lst = list()

# 依照各資料夾內pdf合併
#file_merger = PdfFileMerger()
for folder in folder_lst:
    file_merger = PdfFileMerger()
    for pdf in pdf_dict[folder]:
        file_merger.append(pdf)
    file_merger.write(str(folder)+"merge.pdf")    
    #file_merger.write(output_path+str(folder)+"merge.pdf")


python 不管何時何地,只要點兩下,資料夾內的所有pdf都會合併成一個pdf

        最近有同事問我,有沒有pdf合併的軟體,讓他可以簡易合併PDF?只要放入資料夾,不管有幾個pdf,通通合併成一個pdf。於是就開始自己找Google大神,看看有沒有類似的程式碼可以參考。把程式碼告訴同事後,同事覺得不方便。希望這個程式可以讓他在不同電腦使用。只要點兩下就好,合併的pdf 就在旁邊。不管何時合併,就有該時間的檔案。
        我整理了他的需求:
         1.一個資料夾:這個資料夾可以讓他帶走
         2.資料夾內只有一個程式,對這個程式點兩下,合併的pdf就會出現
         3.資料夾內有個資料夾,其名稱叫Input,那他就會知道將很多的pdf放進去
         4.不管放幾個pdf ,最後要能合併
         5.不管何時合併,就有該時間的檔案。
        換句話說,這個資料夾內有一個資料夾Input 與一個 exe (或者bat,讓他點兩下),然後就有該時間的合併pdf檔案。

        最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:


        以下是程式原始碼的內容:
程式名稱:PdfMerge.py
程式內容:
import os
import time
from PyPDF2 import PdfFileMerger
pdf_lst = list()
# 設定Input為目標路徑
target_path=str(os.path.abspath(os.getcwd()))+'\\Input\\'
# 列出目標路徑內的pdf
for f in os.listdir(target_path):
    if f.endswith('.pdf'):
        pdf_lst.append(os.path.join(target_path,f))

# pdf 合併
file_merger = PdfFileMerger()
for pdf in pdf_lst:
    file_merger.append(pdf)

output_name ="merge"+str(time.strftime("%H-%M-%S",time.localtime()))+".pdf"
file_merger.write(output_name)

資料來源:

2022年6月16日 星期四

如何利用Python程式來處理IP與學校的對應(防火牆LOG)


        縣網中心人員給我兩個Excel 檔案,分別是學校名稱與IP對應表與受攻擊IP對應表。希望我能夠利用這兩個Excel檔案,匯出受攻擊IP 與學校名稱。
壹、問題描述:
一、學校名稱與IP對應表,其格式內容:


二、受攻擊IP對應表,其格式內容:


三、最後的結果呈現,其格式內容:


貳、問題解決歷程:
一、學校名稱與IP對應表,其格式內容:

        要變更為下圖:
                                       

       其中學校名稱與IP對應表,會列出學校名稱、IP最小值與IP最大值。即:測試001國民小學,172.23.80.128~172.23.80.191。那我需要把這項資料調整為:測試001國民小學,172.23.80.128.191
        但是問題來,同樣的校名,測試001國民小學也有另一組IP:192.168.4.1~192.168.4.4。同樣地,我也需要把這項資料調整為:測試001國民小學,192.168.4.1.4
        如果要把這兩項資料變成字典的話,那就會比較麻煩。因為要把[測試001國民小學]當成字典的Index,後面的資料會蓋掉前面的資料。所以我必須在[測試001國民小學]前面加些字元,讓這兩筆資料視為不同資料。最後呈現結果如下:


參、最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:


使用教學說明:
        1.解壓縮後,ListOfSchoolBadIP資料夾內會有input 資料夾。input 資料夾內的檔案名稱為01SchoolExceptionBlacklist.xlsx,其內容格式為
        注意事項:上圖紅色圈選處,會被程式取得資料。若您要更新資料,可直接用新IP資料覆蓋該圈選處即可。或是您有新資料格式跟01SchoolExceptionBlacklist.xlsx一樣,則可以同樣檔名取代原先的檔案。
        2.input 資料夾內的另外一個檔案名稱為02ChcAllSchool2IP.xlsx,其內容格式為
        注意事項:上圖為虛擬資料。您有新資料格式跟02ChcAllSchool2IP.xlsx一樣,則可以同樣檔名取代原先的檔案。
        3.解壓縮後,ListOfSchoolBadIP資料夾內會有PandasOpenpyxlSetup.bat。若您還未安裝pythoon套件Pandas 與 Openpyxl,請對PandasOpenpyxlSetup.bat點兩下。
        4.當一切就緒,您已完成安裝python 3.9.0 與套件Pandas 與 Openpyxl,就可以對ListOfSchoolBadIP.py點兩下,即可出現最後結果檔案ListOfSchoolBadIP.csv。

一、各程式內容:
01.程式目的:安裝套件Pandas 與 Openpyxl
程式名稱:PandasOpenpyxlSetup.bat
程式內容:
@echo off
if not exist %HomeDrive%%HomePath%\AppData\Local\Programs\Python\Python39 (
echo "Please install Python 3.9.0"
start https://skjhcreator.blogspot.com/2022/05/batpython-390.html
) else (
echo "Python 3.9.0 OK"
python -m pip install pandas openpyxl
)
pause
exit

02.程式目的:匯出受攻擊IP、學校名稱對應表CSV
程式名稱:ListOfSchoolBadIP.py
程式內容:
import os
import csv
import openpyxl
# 取得 input資料夾內的兩個Excel檔名
FileName = []
DirPath=str(os.path.abspath(os.getcwd()))+'\\Input\\'
FileName=os.listdir(DirPath)
StrFileName0=DirPath+str(FileName[0])
StrFileName1=DirPath+str(FileName[1])
# 取得第一個Excel內所有的IP並存入list
workbook0 = openpyxl.load_workbook(StrFileName0)
sheet0 = workbook0.worksheets[0]
df0_list = list()
for i in range(2,sheet0.max_row):
     df0_list.append(str(sheet0.cell(row=i,column=2).value).lstrip())
#print(df0_list)
# 取得第二個Excel內所有的年班座號->Email對應表並存入dict
workbook1 = openpyxl.load_workbook(StrFileName1)
sheet1 = workbook1.worksheets[0]
df1_dict = dict()
for i in range(1,sheet1.max_row+1):
     df1_dict[str(sheet1.cell(row=i,column=1).value)]=str(sheet1.cell(row=i,column=2).value)
#print(df1_dict)
# 比較後並寫入CSV
itemplist = list()
jtemplist = list()
OutputFileName = "ListOfSchoolBadIP.csv"
with open(OutputFileName,'w',newline="") as csvfile:
     FieldNames = ['IP','School Name']
     writer = csv.DictWriter(csvfile,fieldnames=FieldNames)
     writer.writeheader()
     for i in df0_list:
          itemplist = i.split('.')
          #print(itemplist[0],itemplist[1],itemplist[2],itemplist[3])
          for j in df1_dict:
               jtemplist = df1_dict[j].split('.')
               #print(jtemplist[0],jtemplist[1],jtemplist[2],jtemplist[3],jtemplist[4])
               if (itemplist[0]==jtemplist[0] and itemplist[1]==jtemplist[1] and itemplist[2]==jtemplist[2] and itemplist[3]>=jtemplist[3]and itemplist[3]<=jtemplist[4]):
                    #print(i,j)
                    writer.writerow({FieldNames[0]:i,FieldNames[1]:j+";"})

Laravel 12 Model 資料庫中的資料表,並提供與資料庫互動的介面

相關系列文章: 1. 在 windows 10 安裝 laravel 12 studentManagement環境與設定 2. laravel 12 route 路由 3. laravel 12 Blade Templates 網頁模版 4. laravel 12 Control...