目錄
一、應用場景
二、需求分析
三、編碼過程
1、思路
2、代碼
當一個文件夾內有許多文件且,文件夾內又嵌套了多層文件夾和文件的情況下就增加了,人工把圖片分開按照一定數量打包的工作繁瑣程度,當文件夾內的文件和目錄較多,且存在多級嵌套的關系時,顯然人工處理就會變得異常艱難,甚至當數據量過大時,打開文件夾都會造成卡頓,在這樣的情況下,利用python對文件分包就是比較好的解決方案。
把一個壓縮包裡的目錄及其子目錄裡的圖片文件按照一定的數量,把圖片每n張存放在一個文件夾內
(1)、創建一個目錄,並把壓縮包解壓到這個目錄下以壓縮包名稱命名的目錄下(這裡因為壓縮包可能不止一個)
(2)、把遍歷目錄書寫為一個函數(當遍歷目錄時當前目錄的子目錄下還有目錄時可以調用函數避免了代碼的繁瑣),遍歷當前目錄,如果不是目錄,判斷是不是圖片格式,如果是目錄,調用當前函數對這個目錄進行遍歷
(3)、如果不是圖片格式,那麼就忽略,如果是圖片格式,就把圖片拷貝到分包目錄並重命名,為每個包裡的圖片保存原始路徑與拷貝後重命名的文件路徑
(1)、用到的類庫
shutil:這裡用於復制文件
OS:python內置庫
concurrent:用於開啟多進程(多進程沒實際測試有沒有用)
(2)、完整代碼
from zipfile import ZipFile
import os
import shutil
import tqdm
from concurrent.futures import ThreadPoolExecutor
class ZipFiles():
def __init__(self):
self.file_count = 1
self.dir_count = 1
def unzipFiles(self,zip_list):
file_name = os.path.basename(zip_list)
folder_name = os.path.splitext(file_name)[0]
os.mkdir(f'./data/{folder_name}')
ZipFile(zip_list,'r').extractall(f'./data/{folder_name}')
files_name = f'./data/{folder_name}'
self.read_all_files(files_name,folder_name)
def read_all_files(self,files_Path,folder_name):
qwd_list = os.listdir(files_Path)
for i in tqdm.tqdm(qwd_list):
directoryName = files_Path+'/'+i
if os.path.isdir(directoryName): #file_Path是二級目錄
self.read_all_files(directoryName,folder_name)
else:
fileExtension = os.path.splitext(i)
if fileExtension[1] == '.jpg' or fileExtension[1] == '.png':
img_Path = directoryName
self.subcontract(img_Path,folder_name)
def subcontract(self,img_Path, folder_name):
package_Path = f'./data/{folder_name}_sub'
if not os.path.exists(package_Path):
os.mkdir(package_Path)
newnames = package_Path+f'/xxxx_{folder_name[-2:]}_{str(self.dir_count).zfill(4)}_sub/xxxx_{folder_name[-2:]}_{str(self.file_count).zfill(6)}.jpg'
if self.file_count%20!=0:
if not os.path.exists(package_Path+f'/xxxx_{folder_name[-2:]}_{str(self.dir_count).zfill(4)}_sub'):
os.mkdir(package_Path + f'/xxxx_{folder_name[-2:]}_{str(self.dir_count).zfill(4)}_sub')
shutil.copyfile(img_Path, newnames)
self.file_count += 1
else:
shutil.copyfile(img_Path, newnames)
self.dir_count += 1
self.file_count += 1
with open(f'{package_Path}/pathDetails.txt','a') as f:
f.write(img_Path+'---'+newnames+'\n')
if __name__ == '__main__':
zip_list = ['./xxx.zip','./yyyy.zip']
if not os.path.exists('./data'):
os.mkdir('./data')
with ThreadPoolExecutor(20) as t:
for i in zip_list:
root = ZipFiles()
t.submit(root.unzipFiles(i))