Python3 中使用zipfile進行文件(夾)的壓縮、解壓縮

一、文件壓縮與解壓縮模塊 zipfile簡介

zipfile 是 Python 標準庫中用于處理 ZIP 壓縮文件的模塊,提供了創建、讀取、寫入、解壓 ZIP 文件的完整功能。它支持多種壓縮算法,無需安裝額外依賴,是處理 ZIP 格式的首選工具。

核心功能與常用類

  1. zipfile.ZipFile
    這是模塊的核心類,用于創建和操作 ZIP 文件,常用參數:
    • file:ZIP 文件路徑或文件對象
    • mode:操作模式('r' 讀取、'w' 創建、'a' 追加)
    • compression:壓縮算法(ZIP_STORED 無壓縮,ZIP_DEFLATED 常用壓縮)

常用操作示例

1. 讀取 ZIP 文件內容
import zipfilewith zipfile.ZipFile('example.zip', 'r') as zf:# 查看壓縮包內所有文件print(zf.namelist())  # 返回文件名列表# 查看文件信息(大小、壓縮率等)for info in zf.infolist():print(f"文件名: {info.filename}, 原始大小: {info.file_size}, 壓縮后: {info.compress_size}")
2. 解壓 ZIP 文件
import zipfilewith zipfile.ZipFile('example.zip', 'r') as zf:# 解壓所有文件到指定目錄(默認當前目錄)zf.extractall(path='解壓目錄')# 解壓單個文件zf.extract('文件路徑/文件名.txt', path='單個文件解壓目錄')
3. 創建 ZIP 文件(壓縮文件/文件夾)
import zipfile
import os# 壓縮單個文件
with zipfile.ZipFile('output.zip', 'w', zipfile.ZIP_DEFLATED) as zf:zf.write('file1.txt', arcname='file1.txt')  # arcname 可指定壓縮包內文件名# 壓縮文件夾(含子目錄)
def zip_folder(folder_path, zip_path):with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)# 保持相對路徑,確保文件夾結構arcname = os.path.relpath(file_path, os.path.dirname(folder_path))zf.write(file_path, arcname=arcname)zip_folder('需要壓縮的文件夾', 'result.zip')
4. 向現有 ZIP 追加文件
import zipfilewith zipfile.ZipFile('existing.zip', 'a', zipfile.ZIP_DEFLATED) as zf:zf.write('new_file.txt')  # 追加新文件到已有壓縮包

注意事項

  • 壓縮算法ZIP_DEFLATED 需要系統支持 zlib 庫(通常默認支持),否則需使用無壓縮的 ZIP_STORED
  • 路徑處理:壓縮文件夾時需通過 arcname 控制路徑,避免生成冗余的絕對路徑。
  • 大型文件:處理大文件時建議使用 with 語句,確保資源正確釋放。

通過 zipfile 模塊,可輕松實現 ZIP 文件的全流程管理,滿足日常壓縮/解壓需求。

二、案例實操

2.0 測試文件準備

原始結構為:

dir_level_1/
├── file1.txt
├── subfolder1/
│   └── file2.txt
└── subfolder2/└── subsubfolder/└── file3.txt

程序設計初衷:

將目錄“dir_level_1”下所有的文件、子文件夾、子文件夾下的文件,安裝原先的層次結構,壓縮為一個文件“dir_level_1.zip”。

2.1 綜合案例:實現文件壓縮、查看壓縮內容、解壓

"""14-5 文件壓縮與解壓模塊-zipFile操作系統提供將一般文件或目錄進行壓縮的功能,壓縮后的擴展名是zip,Python有 zipFile 模塊也可以將文件或目錄壓縮以及解壓縮。壓縮文件或目錄:zipfile.ZipFile(file_name, mode='w', compression=ZIP_DEFLATED)file_name: 壓縮文件的名稱mode: 壓縮文件的模式,w表示寫入,a表示追加compression: 壓縮算法,ZIP_DEFLATED表示使用 deflate 算法進行壓縮解壓文件或目錄:zipfile.ZipFile(file_name, mode='r')14-5-1 執行文件或目錄的壓縮說明:執行文件壓縮前首先要使用ZipFile()方法創建一個壓縮后的文件對象,在這個方法中另外要加上“w”參數,表明未來是提供 write() 方法寫入文件。語法:fileZip = zipfile.ZipFile('out.zip', mode='w',compression=ZIP_DEFLATED)上述fileZip和out.zip皆可以自由命名,fileZip是壓縮文件對象,代表的out.zip,未來將被壓縮的文件數據寫入到此對象中,就可以將結果保存為 out.zip 文件了。注意:1、雖然ZipFile()無法執行整個目錄的壓縮,不過可以使用循環(遞歸)方式將目錄底下的文件或文件夾進行壓縮,即可達到壓縮整個目錄的目的。詳見:c14-5.2_zip_with_hierarchy.py14-5-2 讀取zip文件說明:1、listZipInfo.namelist() : 返回zip文件中所有文件的名稱列表(List)。2、listZipInfo.infolist() : 返回各個元素的屬性,如文件名、文件大小、壓縮結果大小、文件時間、文件CRC碼等。語法:listZipInfo = zipfile.ZipFile('dir_level_1.zip', 'r')print(listZipInfo.namelist()) # 獲取文件(夾)列表print('\n')for fileInfo in listZipInfo.infolist():print(fileInfo.filename,'\t', fileInfo.file_size,'\t', fileInfo.compress_size)14-5-3 解壓縮zip文件說明:1、zipfile.extractall() : 解壓縮zip文件。2、zipfile.extract(fileName) : 解壓縮指定文件。3、zipfile.extractall(path) : 解壓縮zip文件到指定目錄。語法:listZipInfo = zipfile.ZipFile('dir_level_1.zip', 'r')listZipInfo.extractall() # 解壓所有文件listZipInfo.extract('dir_level_1.zip') # 解壓指定文件listZipInfo.close()"""print("----------------------- 案例-14-5-1 執行文件或目錄的壓縮 -----------------------")
# ch14_41.py : 將當前工作目錄下的 dir_level_1 目錄壓縮,壓縮結果存儲在 dir_level_1.zip 文件中.
"""
代碼說明:這行代碼的作用是遍歷dir_level_1目錄下的所有文件和目錄(但不包括子目錄中的內容)。具體解釋如下:glob.glob('dir_level_1/*'):glob是一個用于匹配文件路徑的模塊,支持Unix shell-style的通配符
dir_level_1/*表示匹配dir_level_1目錄下的所有文件和目錄(一級內容)
這個表達式會返回一個包含所有匹配路徑的列表
for name in ...:遍歷glob返回的每個文件/目錄路徑
根據對項目文件結構的查看,dir_level_1目錄包含以下內容:- 多個文件:2.docx、out14_27.txt等- 一個子目錄:dir_level_2(包含1.docx和1.txt)需要注意的是,dir_level_1/*這種模式只會匹配dir_level_1目錄下的直接內容,不會遞歸匹配子目錄中的文件。所以在示例中,它會匹配到2.docx、out14_27.txt等文件以及 dir_level_2目錄本身,但不會匹配dir_level_2 目錄中的1.docx和1.txt。在代碼中,這些匹配到的文件和目錄會被逐一添加到dir_level_1.zip壓縮文件中。
"""
import zipfile
import glob, osfileZip = zipfile.ZipFile('dir_level_1.zip', 'w')
for name in glob.glob('dir_level_1/*'):            # 遍歷指定目錄下的所有文件,但測試下來,僅會壓縮dir_level_1下首層文件及文件夾,而不會將二層dir_level_1\dir_level_2下的文件(如1.txt,1.docx)壓縮進dir_level_1.zip中fileZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) # 參數3為壓縮方式fileZip.close()print("----------------------- 案例-14-5-2 讀取zip文件 -----------------------")
# ch14_41.py : 
import zipfilelistZipInfo = zipfile.ZipFile('dir_level_1.zip', 'r')
print(listZipInfo.namelist()) # 獲取文件(夾)列表
print('\n')
for fileInfo in listZipInfo.infolist():print(fileInfo.filename,'\t', fileInfo.file_size,'\t', fileInfo.compress_size, '\t', fileInfo.date_time, '\t', fileInfo.CRC)
'''
['2.docx', 'out14_27.txt', 'out14_28.txt', 'out14_29.txt', 'out14_30.txt', 'out14_31.txt', 'out41_V3.zip', 'dir_level_2/']2.docx           10240   9080    (2025, 8, 3, 1, 4, 52)          1145032402
out14_27.txt     13      15      (2025, 8, 2, 18, 23, 8)         2445962250
out14_28.txt     3       5       (2025, 8, 2, 18, 23, 8)         595022058
out14_29.txt     47      34      (2025, 8, 2, 18, 23, 8)         1873662565
out14_30.txt     51      36      (2025, 8, 2, 18, 23, 8)         24013343
out14_31.txt     101     42      (2025, 8, 2, 18, 23, 8)         676495025
out41_V3.zip     97041   71141   (2025, 8, 3, 9, 40, 58)         2754552733
dir_level_2/     0       0       (2025, 8, 3, 0, 59, 16)         0
'''print("----------------------- 案例-14-5-3 解壓縮zip文件 -----------------------")
# ch14_43.py : 將程序實例 ch14_41.py 所建立的 dir_level_1.zip 解壓縮,同時將解壓結果存入 out43 目錄
import zipfilefileUnZip = zipfile.ZipFile("dir_level_1.zip", "r")
fileUnZip.extractall("out43")
fileUnZip.close()

2.2 壓縮方法優化-V1版本

上一版壓縮方法的缺陷

代碼中:

fileZip = zipfile.ZipFile('dir_level_1.zip', 'w')
for name in glob.glob('dir_level_1/*'):           fileZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)

這里的fileZip對象無法將文件夾下dir_level_1下文件夾dir_level_2中的文件1.docx壓縮進來,而只會將dir_level_2文件夾本身壓縮進來,未達到程序實現功能的初衷。

改進說明

要解決級聯壓縮文件夾(包含子文件夾結構)的問題,需要遞歸遍歷文件夾中的所有文件,并保持原有的目錄結構。

代碼解釋

要解決級聯壓縮文件夾(包含子文件夾結構)的問題,需要遞歸遍歷文件夾中的所有文件,并保持原有的目錄結構。以下是實現這一功能的完整代碼:

代碼清單

zip_recursive.py

import zipfile
import osdef zip_directory(folder_path, zip_file):"""遞歸壓縮文件夾及其子目錄中的所有文件參數:folder_path (str): 要壓縮的文件夾路徑zip_file (zipfile.ZipFile): 已打開的ZipFile對象"""# 遍歷文件夾中的所有內容for item in os.listdir(folder_path):item_path = os.path.join(folder_path, item)# 如果是文件,直接添加到壓縮包if os.path.isfile(item_path):# 計算相對路徑,保持目錄結構arcname = os.path.relpath(item_path, os.path.dirname(folder_path))zip_file.write(item_path, arcname=arcname)print(f"已添加文件: {arcname}")# 如果是文件夾,遞歸處理elif os.path.isdir(item_path):zip_directory(item_path, zip_file)# 使用示例
if __name__ == "__main__":# 要壓縮的根文件夾路徑root_folder = "dir_level_1"# 壓縮文件保存路徑zip_path = "dir_level_1.zip"# 創建并打開zip文件with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:zip_directory(root_folder, zipf)print(f"壓縮完成,文件保存為: {zip_path}")

代碼解析:

  1. 核心函數zip_directory 函數通過遞歸方式處理文件夾及其子文件夾

    • 對于文件:直接添加到壓縮包,并通過 arcname 參數保持相對路徑
    • 對于子文件夾:遞歸調用自身處理
  2. 關鍵技術點

    • 使用 os.path.relpath 計算文件相對路徑,確保壓縮包內保持原有的目錄結構
    • 使用 with 語句管理 ZipFile 對象,確保資源正確釋放
    • 使用 ZIP_DEFLATED 模式創建壓縮的zip文件(而不是僅存儲)
  3. 使用方法

    • root_folder 設置為根文件夾路徑(如 “dir_level_1”)
    • 運行程序后,會將 dir_level_1 下所有文件、子目錄(包括 dir_level_2 中的 1.docx)完整壓縮到 dir_level_1.zip 中

這樣處理后,壓縮包內會完整保留原有的文件夾層次結構,而不是僅壓縮最內層的文件夾。

2.3 壓縮方法優化-V2版本

V1版缺陷

這樣實現不能忠實的反饋原文件夾結構,本意是希望原先dir_level_1下的文件夾和文件都壓縮至dir_level_1目錄下,而目前的代碼實現的邏輯是dir_level_1下的文件是放在了dir_level_1下,但dir_level_1下的文件夾,如 dir_level_2 卻沒有放在dir_level_1下,而是與dir_level_1平級了。

改進說明

要解決文件夾結構忠實還原的問題,關鍵在于正確設置壓縮包內的相對路徑。以下是改進后的代碼,確保所有文件和子文件夾都正確嵌套在根目錄下。

  1. 核心改進點

    • 明確將根文件夾名稱(root_basename)作為壓縮包內的頂級目錄
    • 所有文件和子文件夾都通過 os.path.join(root_basename, ...) 構建路徑,確保嵌套在根目錄下
    • 使用 zip_subdirectory 專門處理子文件夾,保持完整的層級關系
  2. 結構保證
    假設原始結構為:

    dir_level_1/
    ├── file1.txt
    ├── subfolder1/
    │   └── file2.txt
    └── subfolder2/└── subsubfolder/└── file3.txt
    

    壓縮后在zip文件中會保持完全相同的結構:

    dir_level_1/
    ├── file1.txt
    ├── subfolder1/
    │   └── file2.txt
    └── subfolder2/└── subsubfolder/└── file3.txt
    
  3. 使用方法

    • root_folder 設置為根目錄(如 “dir_level_1”)
    • 運行程序后,所有內容都會被正確壓縮到該根目錄下,不會出現平級問題

這種實現方式能精確還原原始文件夾的層級結構,確保子文件夾都正確嵌套在指定的根目錄下。

代碼清單

zip_with_hierarchy.py

import zipfile
import osdef zip_directory(root_folder, zip_file):"""遞歸壓縮指定文件夾,保持完整的目錄結構參數:root_folder (str): 要壓縮的根文件夾路徑zip_file (zipfile.ZipFile): 已打開的ZipFile對象"""# 獲取根文件夾的基本名稱,作為壓縮包內的頂級目錄root_basename = os.path.basename(root_folder)# 遍歷根文件夾中的所有內容for item in os.listdir(root_folder):item_path = os.path.join(root_folder, item)# 構建壓縮包內的相對路徑,確保所有內容都在根文件夾名下arcname = os.path.join(root_basename, item)if os.path.isfile(item_path):# 添加文件,使用構建的相對路徑zip_file.write(item_path, arcname=arcname)print(f"已添加文件: {arcname}")elif os.path.isdir(item_path):# 遞歸處理子文件夾,同時保持目錄結構zip_subdirectory(item_path, zip_file, root_basename)def zip_subdirectory(subfolder_path, zip_file, root_basename):"""遞歸處理子文件夾,保持相對路徑結構"""# 獲取當前子文件夾相對于根文件夾的路徑rel_path = os.path.relpath(subfolder_path, os.path.dirname(subfolder_path))# 構建壓縮包內的完整路徑base_arcname = os.path.join(root_basename, rel_path)for item in os.listdir(subfolder_path):item_path = os.path.join(subfolder_path, item)arcname = os.path.join(base_arcname, item)if os.path.isfile(item_path):zip_file.write(item_path, arcname=arcname)print(f"已添加文件: {arcname}")elif os.path.isdir(item_path):# 遞歸處理更深層次的子文件夾zip_subdirectory(item_path, zip_file, root_basename)# 使用示例
if __name__ == "__main__":# 要壓縮的根文件夾路徑root_folder = "dir_level_1"# 壓縮文件保存路徑zip_path = "dir_level_1.zip"# 確保根文件夾存在if not os.path.isdir(root_folder):print(f"錯誤: 文件夾 '{root_folder}' 不存在")else:# 創建并打開zip文件,使用DEFLATED模式進行壓縮with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:zip_directory(root_folder, zipf)print(f"壓縮完成,文件保存為: {zip_path}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917526.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Java客戶端使用Redis

目錄 第一步:開放Redis外部連接配置 第二步:配置端口轉發 第三步:在IDEA中導入依賴 第四步:編寫代碼命令 連接環境:Java客戶端為本地IDEA,Redis服務器安裝在云服務器Ubuntu系統中。 第一步:開…

【MySQL】MySQL索引—B樹/B+樹

目錄 1. 數據庫索引 1.1 索引的概念 1.2 索引的特點 1.3 索引查詢對比普通的查詢 1.4 索引的操作 1.5 索引的原理 1.6 B樹 1.7 B樹 1.8 B樹的優點 1. 數據庫索引 1.1 索引的概念 數據庫的索引是一種特殊的數據結構,里面包含著數據表中所有記錄的引用&…

jQuery Mobile 面板詳解

jQuery Mobile 面板詳解 引言 隨著移動設備的普及,移動網頁開發變得越來越重要。jQuery Mobile 是一個基于 jQuery 的移動網頁開發框架,它提供了一套豐富的 UI 組件和主題,使得開發者可以快速構建出美觀、響應式的移動網頁。在 jQuery Mobile 中,面板(Panel)是一個非常…

Python中的import和from...import有什么區別?

文章目錄 前言 一、import導入模塊 導入模塊并給它一個別名 語法格式 二、from...import導入特定項 1.導入模塊中的特定項 2.導入模塊中的所有項 2.1 命名空間核污染 2.2 性能影響 總結 前言 在Python編程中,模塊和包的導入機制是編寫可維護、可擴展代碼的核心。深入理解Pyth…

vscode提示“無法使用 compilerPath 解析配置”解決辦法

0 問題描述 使用vscode的Remote-SSH插件連接安裝在虛擬機上的Windows10進行遠程開發時,出現如下提示:無法使用 compilerPath 解析配置:“D:\mingw64\bin\gcc.exe” 所有包含C庫頭文件的文件都被標紅提示錯誤:1 問題原因 vscode沒有設置正確的…

信噪比(Signal-to-Noise Ratio, SNR)詳細介紹

信噪比(Signal-to-Noise Ratio, SNR)信噪比(Signal-to-Noise Ratio,SNR)是衡量信號質量的重要參數,表示有用信號的功率與背景噪聲功率的比值。SNR在通信、音頻處理、視頻處理以及其他電子信號處理領域中具有…

Nginx 相關實驗(1)

nginx源碼編譯 本實驗采用nginx源碼編譯的安裝方式,需要準備一個tar包,可從nginx官網上下載。 下載地址:nginx: downloadhttps://nginx.org/en/download.html 將下載好的壓縮包傳到虛擬機中的自定義目錄下 [rootwebserver ~]# ls anacond…

【選型】HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議(ST 原廠 vs 國產芯片)(單片機選型主要考慮的參數與因素)

國產 vs ST 單片機在工業控制中的性能對比分析 HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議 工業控制領域 MCU 選型:國產航順 HK32 與 ST 原廠芯片深入比較 國產 MCU 是否可替代 ST?基于發電機控制應用的深入評估 從數據手冊看 MCU 制造工藝差異:HK32L088 vs S…

LLM Prompt與開源模型資源(1)提示詞工程介紹

學習材料:https://www.hiascend.com/developer/courses/detail/1935520434893606913學習時長: 預計 30 分鐘學習目的: 了解提示工程的定義與作用 熟悉提示工程的關鍵技術相關概念 掌握基于昇騰適配的大模型提示工程的入門及進階指南 提示…

kafka與其他消息隊列(如 RabbitMQ, ActiveMQ)相比,有什么優缺點?

Kafka、RabbitMQ 和 ActiveMQ 是三種最主流的消息中間件,它們的設計和適用場景有所不同。 我們可以通過一個簡單的表格來快速了解它們的核心區別: 核心對比一覽特性 / 維度KafkaRabbitMQActiveMQ核心模型分布式、持久化的日志系統 (Dumb Broker / Smart …

Kubernetes架構和部署

k8s組件 master節點:管理節點 管理平面組件 api server : api gateway controller manager scheduler etcd 數據庫 worker節點:被管理節點,運行容器 kubelet:k8s agent container runtime:docker,containerd,cri-o kube-proxy:service 網絡 ????????…

建造者模式及優化

建造者模式是一種創建型設計模式,它將復雜對象的構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。核心思想是指揮者定流程,建造者填細節,通過多個步驟逐步構建對象,并允許靈活組合這些步驟以生成不同配置的…

【09】C++實戰篇——C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧

文章目錄1 C 靜態庫.lib 生成1.1 靜態庫lib的生成方法和使用方法1.2 創建靜態庫項目1.3 編寫.h 和 .cpp文件1.4 設置 及 生成 DLL2 調用 C 靜態庫lib2.1 新建LIBtest及測試代碼2.2 靜態庫配置 及代碼調用測試3 實際項目中的使用技巧、及通用設置3.1 設置lib輸出路徑3.2 設置頭文…

飛算JavaAI:從寫不出代碼到絲滑開發,飛算JavaAI把小白從編程深淵撈進了正軌---它都讓我懷疑自己是不是多余的!

開篇介紹 對于很多初學者來說,編程是一項既有趣又充滿挑戰的任務。面對復雜的代碼和繁瑣的開發流程,常常會感到無從下手。不過,現在有了飛算JavaAI,這一切都將變得簡單起來。 它有啥實用功能呢? 比如: …

關于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用時鐘模塊GeneralGtmCfg_DevErrorDetect開發者錯誤檢測開關GtmCfg_DemErrorReporting診斷錯誤報告開關GtmCfg_VersionInfoApi獲取版本信息的接口開關GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局時鐘分頻器的分子Global_Cloc…

深入探索Weaviate:構建高效AI應用的數據庫解決方案

在當今數據驅動的世界中,高效地存儲、檢索和處理大規模數據成為了AI應用開發的關鍵挑戰。Weaviate作為一個開源的向量搜索引擎,憑借其強大的功能和靈活的架構,正逐漸成為開發者構建智能AI應用的首選工具。本文將深入探討Weaviate的核心概念、…

【開源】一款開源、跨平臺的.NET WPF 通用權限開發框架 (ABP) ,功能全面、界面美觀

文章目錄一、開源地址二、框架介紹三、技術路線四、適用場景五、功能模塊六、框架演示截圖一、開源地址 Gihub地址: https://github.com/HenJigg/wpf-abp B站學習視頻:https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信創緩存中間件-TongRDS(Redis平替)安裝

TongRDS 是由東方通開發的國產 分布式內存數據緩存中間件,功能類似于 Redis,但它是完全自主研發的國產產品,是國內信創的一大重要組件。它兼容 Redis 的接口,能做到應用代碼無需改動即可替換使用。TongRDS是沒有直接的下載地址的。…

Git鏈接備用手冊

三板斧及其他:git init:初始化git倉庫git add . :將所在文件夾中的所有文件加入到暫存區git commit -m 自定義記錄信息 :將暫存區中的數據放到Git的倉庫(本地)中,并進行記錄(自定義&#xff0…

零信任網絡概念及在網絡安全中的應用

零信任網絡概念及在網絡安全中的應用 零信任網絡(Zero Trust Network)是一種顛覆傳統邊界安全的架構理念,其核心是**“永不信任,始終驗證”**(Never Trust, Always Verify)。它假設網絡內外均存在威脅&…