使用Python調用7-Zip【按大小分組】壓縮文件夾中所有文件
- 問題描述:
- 方法
- 前提條件
- 任務
- 完整代碼示例
- 代碼如何工作?
問題描述:
我現在想把文件夾下的所有內容上傳到網盤,但是這個文件夾下的素材內容很多,使用分卷壓縮的話,要一起壓縮完上傳。解壓時得一起下載完再解壓。200多G太大了。
又因為其實我用不完這個文件夾下全部的素材,有時候只下載一些就夠用了,所以我希望:
能使用python
調用 7-zip
,每20G
壓縮一個壓縮包,命名后保存。直到把文件夾下所有的文件壓縮完。
方法
前提條件
在動手之前,你需要準備以下工具:
- Python:推薦使用Python 3.x版本,已安裝并可運行。
- 7-Zip:一個免費的壓縮工具,點擊這里下載并安裝。
- 基本環境:確保你的電腦上Python和7-Zip都能正常運行。
任務
- 文件管理:將大文件夾拆分成小份,便于上傳或存儲。
- 自動化:通過Python腳本,避免手動操作的繁瑣。
- 通用性:不僅限于視頻文件,適用于任何類型文件。
完整代碼示例
- `seven_zip_path`:替換為你的7zip的安裝路徑。
folder_path
:替換為你的文件夾路徑。output_dir
:設置壓縮包保存位置。max_size_gb
:調整每組的大小(比如10GB、50GB)。password
:輸入你的壓縮包密碼,或者留空(password = None
)。
import os
import subprocess# 獲取文件夾中的所有文件
def get_all_files(folder_path):"""遍歷文件夾,返回所有文件的路徑列表"""file_list = []for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)file_list.append(file_path)return file_list# 按大小分組文件
def group_files_by_size(file_list, max_size_gb=25):"""將文件按指定大小(GB)分組"""max_size_bytes = max_size_gb * 1024 * 1024 * 1024 # GB轉換為字節groups = []current_group = []current_size = 0for file in file_list:file_size = os.path.getsize(file)# 如果當前組加上新文件超出限制,且當前組不為空,則新建一組if current_size + file_size > max_size_bytes and current_group:groups.append(current_group)current_group = []current_size = 0current_group.append(file)current_size += file_size# 添加最后一組if current_group:groups.append(current_group)return groups# 使用7-Zip壓縮一組文件
def compress_files(group, output_file, seven_zip_path, password=None):"""調用7-Zip壓縮一組文件,可選設置密碼"""# 檢查7-Zip是否可用if not os.path.exists(seven_zip_path):print("錯誤:請檢查7-Zip安裝路徑是否正確!")return# 構建7-Zip命令command = [seven_zip_path,"a", # 添加到壓縮包"-t7z", # 使用7z格式output_file, # 輸出文件名]if password: # 如果設置了密碼command.extend(["-p{}".format(password), "-mhe=on"]) # 添加密碼并加密文件名command.extend(group) # 添加文件列表# 執行壓縮try:result = subprocess.run(command, capture_output=True, text=True)if result.returncode == 0:print(f"壓縮成功:{output_file}")else:print(f"壓縮失敗:{result.stderr}")except Exception as e:print(f"發生錯誤:{str(e)}")# 主函數
def main():# 配置參數seven_zip_path = r"D:\Program Files\7-Zip\7z.exe" # 7-Zip安裝路徑,可根據需要修改folder_path = r"D:\MyFiles" # 要壓縮的文件夾路徑output_dir = r"D:\CompressedFiles" # 壓縮包保存目錄max_size_gb = 25 # 每組最大大小(GB)password = "mysecret123" # 壓縮密碼(可選,留空則無密碼)# 創建輸出目錄(如果不存在)if not os.path.exists(output_dir):os.makedirs(output_dir)# 獲取文件列表files = get_all_files(folder_path)if not files:print("錯誤:文件夾中沒有文件!")return# 分組文件file_groups = group_files_by_size(files, max_size_gb)# 壓縮每組文件for i, group in enumerate(file_groups, start=1):output_file = os.path.join(output_dir, f"Part_{i}.7z")print(f"正在壓縮第 {i} 組文件...")compress_files(group, output_file, seven_zip_path, password)if __name__ == "__main__":main()
代碼如何工作?
-
get_all_files
- 使用
os.walk
遍歷文件夾,收集所有文件的完整路徑。 - 適用于任何文件類型,不局限于視頻。
- 使用
-
group_files_by_size
- 根據文件大小(字節)將文件分組。
- 每組大小不超過
max_size_gb
,通過累加文件大小判斷是否需要新建一組。
-
compress_files
- 使用
subprocess.run
調用7-Zip,執行壓縮命令。 - 支持可選密碼保護,加密文件名(
-mhe=on
)。
- 使用
-
main
- 設置輸入文件夾、輸出目錄、分組大小和密碼。
- 按順序處理每組文件,生成獨立的壓縮包。