朝花夕拾(四) --------python中的os庫全指南

目錄

Python os模塊完全指南:從基礎到高階文件操作

1. 引言:為什么需要os模塊?

1.1 os模塊的重要性

1.2 適用場景

1.3 os模塊的"瑞士軍刀"特性

2. os模塊基礎功能

2.1 文件與目錄操作

2.1.1 核心方法介紹

2.1.2 避坑指南

2.2 路徑操作(os.path子模塊)

2.2.1 關鍵方法介紹

2.2.2 實戰技巧

3. 系統交互與高級功能

3.1 環境變量與進程管理

3.1.1 環境變量操作

3.1.2 進程控制

3.1.3 注意事項

3.2 文件權限與元數據

3.2.1 文件權限管理

3.2.2 文件元數據

3.2.3 跨平臺注意事項

4. 實戰案例

4.1 案例1:批量重命名文件

4.2 案例2:遞歸統計目錄大小

4.3 案例3:文件搜索工具

5. 常見問題解答(Q&A)

Q1:os.path和pathlib哪個更好?

Q2:為什么os.remove()有時會報PermissionError?

Q3:如何安全地執行系統命令?

6. 總結與擴展學習

6.1 核心要點回顧

6.2 最佳實踐建議

6.3 擴展學習推薦

6.4 最終建議


Python os模塊完全指南:從基礎到高階文件操作

1. 引言:為什么需要os模塊?

在日常的Python開發中,我們經常需要與操作系統進行交互,比如讀取文件、創建目錄、執行系統命令等。如果直接使用Python的基礎功能來完成這些操作,要么非常繁瑣,要么根本無法實現。這時,Python標準庫中的os模塊就派上了大用場。

os模塊是Python與操作系統交互的接口,它提供了豐富的函數和方法來處理文件和目錄、訪問環境變量、執行系統命令等。相比手動拼接路徑字符串(如"C:\\Users\\test.txt"),使用os.path.join("C:", "Users", "test.txt")不僅代碼更簡潔,還能自動處理不同操作系統的路徑分隔符差異。

1.1 os模塊的重要性

os模塊的重要性主要體現在以下幾個方面:

  1. ??跨平臺兼容性??:不同操作系統(Windows、Linux、MacOS)對路徑、文件權限等的處理方式不同,os模塊提供了統一的接口,讓你的代碼可以在不同平臺上運行而無需修改。

  2. ??功能全面??:從簡單的文件操作到復雜的系統交互,os模塊幾乎涵蓋了所有與操作系統相關的功能需求。

  3. ??性能優化??:os模塊中的許多函數都是用C語言實現的,執行效率比純Python代碼高很多。

1.2 適用場景

os模塊適用于以下場景:

  • 文件和目錄的創建、刪除、重命名

  • 路徑的拼接、解析和規范化

  • 獲取文件屬性和元數據

  • 執行系統命令

  • 訪問和修改環境變量

  • 進程管理

1.3 os模塊的"瑞士軍刀"特性

就像瑞士軍刀集成了多種工具一樣,os模塊也集成了大量與操作系統交互的功能。它主要包含以下幾類功能:

  1. ??文件和目錄操作??:如os.listdir()os.mkdir()

  2. ??路徑操作??:通過os.path子模塊實現

  3. ??系統信息獲取??:如os.name獲取操作系統類型

  4. ??進程管理??:如os.system()執行系統命令

  5. ??環境變量訪問??:通過os.environ實現

2. os模塊基礎功能

2.1 文件與目錄操作

2.1.1 核心方法介紹

os模塊提供了豐富的文件和目錄操作方法,下面介紹幾個最常用的:

  1. ??列出目錄內容?? - os.listdir()

import os# 列出當前目錄下的所有文件和子目錄
contents = os.listdir('.')
print(contents)
  1. ??創建目錄?? - os.mkdir()os.makedirs()

# 創建單層目錄
os.mkdir('new_dir')# 遞歸創建多層目錄
os.makedirs('path/to/new_dir')
  1. ??刪除文件或目錄?? - os.remove()os.rmdir()

# 刪除文件
os.remove('file.txt')# 刪除空目錄
os.rmdir('empty_dir')
  1. ??重命名文件或目錄?? - os.rename()

os.rename('old_name.txt', 'new_name.txt')
2.1.2 避坑指南

在使用這些方法時,有幾個常見的坑需要注意:

  1. ??os.makedirs()vs os.mkdir()的區別??:

    • os.mkdir()只能創建單層目錄,如果父目錄不存在會報錯

    • os.makedirs()會遞歸創建所有需要的父目錄

  2. ??刪除非空目錄??:

    • os.rmdir()只能刪除空目錄

    • 要刪除非空目錄,可以使用shutil.rmtree()

    import shutil
    shutil.rmtree('non_empty_dir')
  3. ??文件操作異常處理??:

    文件操作可能會遇到各種異常,如文件不存在、權限不足等,建議使用try-except塊處理:

    try:os.remove('file.txt')
    except FileNotFoundError:print("文件不存在")
    except PermissionError:print("權限不足")

2.2 路徑操作(os.path子模塊)

os.pathos模塊的一個子模塊,專門用于處理路徑相關的操作。它提供了一系列函數來解析、拼接、檢查路徑。

2.2.1 關鍵方法介紹
  1. ??路徑拼接?? - os.path.join()

# 跨平臺路徑拼接
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path)  # 在Windows上輸出:folder\subfolder\file.txt# 在Linux/Mac上輸出:folder/subfolder/file.txt
  1. ??獲取絕對路徑?? - os.path.abspath()

abs_path = os.path.abspath('file.txt')
print(abs_path)  # 輸出:/Users/username/project/file.txt
  1. ??檢查路徑是否存在?? - os.path.exists()

if os.path.exists('file.txt'):print("文件存在")
else:print("文件不存在")
  1. ??判斷路徑類型??:

os.path.isdir('path')  # 是否是目錄
os.path.isfile('path') # 是否是文件
os.path.islink('path') # 是否是符號鏈接
2.2.2 實戰技巧
  1. ??路徑規范化??:

    normalized = os.path.normpath("C:/Users//test.txt")
    print(normalized)  # 輸出:C:\Users\test.txt
  2. ??獲取文件擴展名??:

    ext = os.path.splitext("data.json")[1]
    print(ext)  # 輸出:.json
  3. ??獲取文件名和目錄名??:

    dirname = os.path.dirname("/path/to/file.txt")  # /path/to
    basename = os.path.basename("/path/to/file.txt")  # file.txt
  4. ??獲取文件大小和時間戳??:

    size = os.path.getsize('file.txt')  # 文件大小(字節)
    mtime = os.path.getmtime('file.txt')  # 最后修改時間(時間戳)

3. 系統交互與高級功能

3.1 環境變量與進程管理

3.1.1 環境變量操作

環境變量是操作系統提供的全局變量,os模塊提供了訪問和修改環境變量的接口。

  1. ??獲取環境變量??:

# 獲取PATH環境變量
path = os.environ.get('PATH')
print(path)# 獲取所有環境變量
for key, value in os.environ.items():print(f"{key}: {value}")
  1. ??設置環境變量??:

# 臨時設置環境變量(僅在當前進程有效)
os.environ['TEMP_DIR'] = '/tmp'

注意:通過os.environ設置的環境變量只在當前Python進程及其子進程中有效,不會影響系統全局環境變量。

3.1.2 進程控制

os模塊提供了一些基本的進程控制功能:

  1. ??執行系統命令?? - os.system()

# 執行ping命令
return_code = os.system("ping -c 4 127.0.0.1")
print(f"命令返回碼:{return_code}")
  1. ??啟動文件?? - os.startfile()(Windows特有)

# 用默認程序打開文件
os.startfile("document.pdf")
  1. ??獲取進程ID??:

print("當前進程ID:", os.getpid())
print("父進程ID:", os.getppid())
3.1.3 注意事項
  1. os.system()存在安全風險,特別是當命令字符串包含用戶輸入時,可能導致命令注入攻擊。更安全的替代方案是使用subprocess模塊。

  2. os.startfile()是Windows平臺特有的函數,在其他平臺上不可用。

3.2 文件權限與元數據

在不同操作系統中,文件權限的管理方式各不相同。os模塊提供了一些跨平臺的文件權限管理方法。

3.2.1 文件權限管理
  1. ??修改文件權限?? - os.chmod()

# 設置文件權限為755(所有者可讀可寫可執行,其他用戶可讀可執行)
os.chmod("script.sh", 0o755)
  1. ??獲取文件權限??:

import statmode = os.stat("file.txt").st_mode
if mode & stat.S_IRUSR:print("所有者有讀權限")
if mode & stat.S_IWGRP:print("組用戶有寫權限")
3.2.2 文件元數據

通過os.stat()可以獲取文件的詳細元數據:

file_stats = os.stat("file.txt")print(f"文件大小: {file_stats.st_size} 字節")
print(f"最后訪問時間: {file_stats.st_atime}")
print(f"最后修改時間: {file_stats.st_mtime}")
print(f"創建時間: {file_stats.st_ctime}")  # Windows上是創建時間,Linux上是最后狀態變更時間
3.2.3 跨平臺注意事項
  1. 在Windows上,某些權限標志可能無效。

  2. 文件時間戳在不同平臺上的精度可能不同。

  3. st_ctime在Windows上表示創建時間,而在Unix-like系統上表示最后狀態變更時間。

4. 實戰案例

4.1 案例1:批量重命名文件

在實際工作中,我們經常需要對大量文件進行批量重命名。下面是一個使用os模塊實現批量重命名的完整示例:

import osdef batch_rename(directory, prefix):"""批量重命名目錄中的文件:param directory: 目標目錄路徑:param prefix: 新文件名前綴"""# 切換到目標目錄os.chdir(directory)# 遍歷目錄中的文件for i, filename in enumerate(os.listdir()):# 跳過目錄if os.path.isdir(filename):continue# 獲取文件擴展名_, ext = os.path.splitext(filename)# 構造新文件名new_name = f"{prefix}_{i+1}{ext}"# 重命名文件os.rename(filename, new_name)print(f"Renamed: {filename} -> {new_name}")# 使用示例
batch_rename("images", "photo")

??代碼說明??:

  1. 使用os.chdir()切換到目標目錄

  2. os.listdir()獲取目錄內容

  3. os.path.isdir()過濾掉子目錄

  4. os.path.splitext()分離文件名和擴展名

  5. os.rename()執行重命名操作

??效果展示??:

假設images目錄下有以下文件:

img1.jpg
img2.png
img3.gif

運行batch_rename("images", "photo")后,目錄內容變為:

photo_1.jpg
photo_2.png
photo_3.gif

4.2 案例2:遞歸統計目錄大小

另一個常見需求是計算目錄及其子目錄的總大小。下面是實現這一功能的代碼:

import osdef get_dir_size(path):"""遞歸計算目錄大小(字節):param path: 目錄路徑:return: 目錄總大小(字節)"""total = 0# 使用os.scandir()更高效with os.scandir(path) as it:for entry in it:if entry.is_file():total += entry.stat().st_sizeelif entry.is_dir():total += get_dir_size(entry.path)return totaldef format_size(size):"""格式化文件大小顯示:param size: 文件大小(字節):return: 格式化后的字符串"""for unit in ['B', 'KB', 'MB', 'GB']:if size < 1024:return f"{size:.2f}{unit}"size /= 1024return f"{size:.2f}TB"# 使用示例
directory = "/path/to/directory"
size_bytes = get_dir_size(directory)
print(f"目錄總大小: {format_size(size_bytes)}")

??代碼優化點??:

  1. 使用os.scandir()代替os.listdir(),因為它返回的是DirEntry對象,性能更好

  2. 遞歸處理子目錄

  3. 添加了格式化顯示大小的功能

??輸出示例??:

目錄總大小: 1.23GB

4.3 案例3:文件搜索工具

下面實現一個簡單的文件搜索工具,可以按名稱搜索文件:

import osdef find_files(directory, pattern):"""在目錄中遞歸搜索匹配pattern的文件:param directory: 搜索根目錄:param pattern: 要匹配的文件名模式(不區分大小寫):return: 匹配文件的完整路徑列表"""matched_files = []for root, dirs, files in os.walk(directory):for filename in files:if pattern.lower() in filename.lower():full_path = os.path.join(root, filename)matched_files.append(full_path)return matched_files# 使用示例
results = find_files("/Users/username/Documents", "report")
for file in results:print(file)

??代碼特點??:

  1. 使用os.walk()遞歸遍歷目錄樹

  2. 支持不區分大小寫的模糊匹配

  3. 返回匹配文件的完整路徑

5. 常見問題解答(Q&A)

Q1:os.pathpathlib哪個更好?

??A??:pathlib是Python 3.4引入的面向對象的路徑操作庫,相比os.path有以下優勢:

  1. 更直觀的面向對象接口:

    # os.path風格
    os.path.join(dirname, filename)# pathlib風格
    Path(dirname) / filename
  2. 鏈式調用更簡潔:

    path = Path("/path/to/file.txt")
    path.parent.name  # 獲取父目錄名
  3. 集成了更多實用方法,如:

    path.read_text()  # 讀取文件內容
    path.write_text("content")  # 寫入文件

??建議??:

  • 新項目優先使用pathlib

  • 維護舊代碼時保持使用os.path

  • 兩者可以互相轉換:

    from pathlib import Path
    str_path = str(Path("/path/to/file"))  # Path -> str
    path_obj = Path(os.path.join("a", "b"))  # os.path -> Path

Q2:為什么os.remove()有時會報PermissionError

??A??:PermissionError通常有以下原因:

  1. 文件被其他程序占用(特別是在Windows上)

  2. 當前用戶沒有刪除權限

  3. 文件設置了只讀屬性

??解決方案??:

  1. 檢查文件是否被其他程序打開

  2. 修改文件權限或屬性:

    # Windows上去除只讀屬性
    os.chmod(filepath, stat.S_IWRITE)
  3. 使用try-except處理異常:

    try:os.remove(filepath)
    except PermissionError:print("無法刪除文件,可能正在被使用")

Q3:如何安全地執行系統命令?

??A??:os.system()存在安全風險,特別是當命令包含用戶輸入時。更安全的替代方案:

  1. 使用subprocess.run()

    import subprocess# 安全執行命令
    result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
    print(result.stdout)
  2. 避免直接拼接命令字符串:

    # 危險!可能被注入
    user_input = "file; rm -rf /"
    os.system(f"ls {user_input}")# 安全方式
    subprocess.run(["ls", user_input])
  3. 設置超時防止命令長時間運行:

    try:subprocess.run(["ping", "127.0.0.1"], timeout=10)
    except subprocess.TimeoutExpired:print("命令執行超時")

6. 總結與擴展學習

6.1 核心要點回顧

通過本文的學習,我們掌握了os模塊的核心功能:

  1. ??文件和目錄操作??:

    • 創建/刪除:os.mkdir(), os.makedirs(), os.remove(), os.rmdir()

    • 遍歷目錄:os.listdir(), os.scandir(), os.walk()

    • 文件信息:os.stat(), os.path.getsize()

  2. ??路徑操作??:

    • 拼接:os.path.join()

    • 解析:os.path.dirname(), os.path.basename()

    • 檢查:os.path.exists(), os.path.isfile()

  3. ??系統交互??:

    • 環境變量:os.environ

    • 執行命令:os.system()

    • 文件權限:os.chmod()

6.2 最佳實踐建議

  1. ??路徑處理??:

    • 永遠使用os.path.join()代替字符串拼接

    • 考慮使用pathlib獲得更現代的API

  2. ??異常處理??:

    • 文件操作總是可能失敗,添加適當的異常處理

    • 常見異常:FileNotFoundError, PermissionError, IsADirectoryError

  3. ??跨平臺兼容??:

    • 不要假設路徑分隔符(Windows用\`,Linux用/`)

    • 不要假設文件大小寫(Linux區分,Windows不區分)

6.3 擴展學習推薦

  1. ??進階模塊??:

    • shutil:高階文件操作(復制、移動、歸檔等)

    • glob:文件模式匹配(如*.txt

    • tempfile:安全創建臨時文件和目錄

  2. ??性能優化??:

    • 對于大量文件操作,使用os.scandir()代替os.listdir()

    • 考慮使用生成器表達式處理大型目錄樹

  3. ??安全實踐??:

    • 使用subprocess代替os.system()

    • 處理用戶輸入時進行嚴格的驗證和轉義

6.4 最終建議

os模塊是Python開發者必須掌握的核心工具之一。建議讀者:

  1. 在自己的項目中實踐本文的示例代碼

  2. 查閱官方文檔了解更詳細的功能說明

  3. 遇到問題時,優先考慮使用os模塊提供的標準解決方案

通過熟練掌握os模塊,你將能夠編寫出更健壯、更高效的Python程序,輕松應對各種文件系統和操作系統交互需求。希望這篇博客對你有所幫助!

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

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

相關文章

uniappx 安卓端本地打包的一些總結

本人之前沒用過android studio&#xff0c;因為有打包到安卓端的需求&#xff0c;所以有了這篇文章。下面一些內容不正常工作&#xff0c;也不報錯&#xff0c;是很煩的&#xff0c;根本不知道是哪里出了問題。比如對應的aar包沒有引入。或者沒有注冊信息。 在實現過程中我遇到…

AUTOSAR進階圖解==>AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP網絡管理詳解 基于AUTOSAR標準的UDP網絡管理模塊架構分析與實現指南目錄 1. 概述2. UDP網絡管理架構 2.1 整體架構圖2.2 架構組件詳解 3. UDP網絡管理狀態機 3.1 狀態機圖3.2 狀態詳解 4. UDP網絡管理操作序列 4.1 序列圖4.2 操作流程詳解 5. UDP網絡管理配置模型 …

AI搜索引擎下的內容優化新范式:GEO的關鍵技術解析

摘要&#xff1a; 生成式AI搜索引擎的崛起&#xff0c;催生了GEO&#xff08;Generative Engine Optimization&#xff09;這一新的優化領域。本文將深入剖析GEO背后的關鍵技術&#xff0c;包括深度語義理解、結構化內容生成、以及AI算法的適配性&#xff0c;旨在為品牌在AI時代…

Java Lambda表達式是什么,怎么用

這種代碼是什么&#xff0c;怎么閱讀/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

集成運算放大器(反向加法,減法)

反向加法電路原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;輸出電壓-&#xff08;R4/R1*V1R4/R2*V2R4/R3*V3&#xff09;。平衡電阻R4等于R1和R2和R3的并聯電壓。減法運算電路原理&#xff1a;結論&#xff1a;減法運算電路分為三種不同情況&#xff0c;第一種情況為…

Maven入門到精通

目錄 一&#xff0c;Maven概述 1.1介紹 1.2安裝 1.3Maven生命周期和插件 1.4Maven的坐標的本地倉庫的存儲地址 二&#xff0c;依賴管理 2.1依賴管理——依賴范圍 2.2依賴管理——添加依賴 獲取依賴坐標 依賴添加后的操作 2.3依賴管理——依賴傳遞 2.4依賴管理——依…

計算機網絡 TCP 延遲確認機制

TCP 延遲確認&#xff08;Delayed Acknowledgments&#xff0c;簡稱 Delayed ACK&#xff09;是 TCP 協議中一項旨在減少網絡中小數據包數量、提升傳輸效率的優化機制。其核心思想是&#xff1a;不立即回復 ACK&#xff0c;而是等待一段時間&#xff08;通常 40ms&#xff09;&…

【visual studio】visual studio配置環境opencv和onnxruntime

下載opencv https://opencv.org/releases/?spma2ty_o01.29997173.0.0.57f4c921RELipW配置環境變量visual studio配置opencv 新建c項目選中文件后右鍵選擇屬性添加include文件夾庫文件添加lib添加lib文件 將上一步的lib文件夾下的兩個文件復制到這里以下兩者區別在于&#xff0…

【Java】多線程Thread類

1. 進程與線程進程與線程的基本認識進程&#xff08;Process&#xff09;&#xff1a;進程是程序的一次動態執行過程&#xff0c;它經歷了從代碼加載、執行、到執行完畢的一個完整過程&#xff1b;同時也是并發執行的程序在執行過程中分配和管理資源的基本單位&#xff0c;競爭…

C/C++復習(四)

一.模版 模版涉及的是泛型編程&#xff0c;即通過編譯器去確定類型的編程方式&#xff0c;模版分為&#xff1a;類模板和函數模版&#xff0c;下面我們一一復習&#xff1a; 函數模版&#xff1a; 格式&#xff1a; template<typename T1, typename T2,......,typename Tn&g…

022 基礎 IO —— 文件

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄基礎 IO —— C 語言文件 I/O 操作基礎前言1. C 語言文件操作函數匯…

MNN LLM Chat iOS 流式輸出優化實踐

本文介紹了在 iOS 平臺上使用 MNN 框架部署大語言模型&#xff08;LLM&#xff09;時&#xff0c;針對聊天應用中文字流式輸出卡頓問題的優化實踐。通過分析模型輸出與 UI 更新不匹配、頻繁刷新導致性能瓶頸以及缺乏視覺動畫等問題&#xff0c;作者提出了一套包含智能流緩沖、U…

【開發技巧】VS2022+QT5+OpenCV4.10開發環境搭建QT Creator

VS2022編譯器支持配置 QT5默認安裝以后支持的是VS2015與VS2017&#xff0c;不支持VS2022&#xff0c;所以必須首先在Qt Creator中配置支持VS2022。配置順序如下&#xff1a; 首先打開【工具】->【選項】 然點擊Kits里面的【編譯器】選項。點擊Manual下面的【C】然后點擊【…

【Linux系統】動靜態庫的制作

前言&#xff1a; 上文我們講到了文件系統【Linux系統】詳解Ext2&#xff0c;文件系統-CSDN博客 本文我們來講講動靜態庫的制作 庫 【Linux】編譯器gcc/g及其庫的詳細介紹_linux gcc 有哪些庫-CSDN博客 這篇文章的第4大點&#xff0c;簡單是介紹了一下庫的基本概念。 靜態庫 靜…

鏈式二叉樹的基本操作——遍歷

本文筆者將帶領讀者一起學習鏈式二叉樹的一些基本語法&#xff0c;至于更難一些的插入刪除等&#xff0c;筆者將在后續C更新后再次詳細帶領大家學習。 首先&#xff0c;在進行二叉樹之前&#xff0c;我們需要一顆二叉樹&#xff0c;而二叉樹的初始化現階段實現不太現實&#x…

Windows運維之以一種訪問權限不允許的方式做了一個訪問套接字的嘗試

一、問題場景 在Windows 上運維服務過程中&#xff0c;經常會遇到運行服務&#xff0c;部署安裝時候無任何問題&#xff0c;后續再某個特殊時間點&#xff0c;突然服務無法啟動了。再次啟動時&#xff0c;提示端口占用與以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。 …

2020/12 JLPT聽力原文 問題二 3番

3番&#xff1a;レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女&#xff1a;店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男&#xff1a;ああ、サラダだけで満足できるっ…

芯片行業主要廠商

作為一個小白&#xff0c;每次淘寶買芯片時看到相似的命名規則&#xff1a;“OPA、AD、LT、MAX”等等時&#xff0c;我不禁好奇這些芯片行業大廠有哪些&#xff0c;所以查了些資料&#xff1a; 1. 德州儀器&#xff08;Texas Instruments, TI&#xff09; 公司概況&#xff1…

【BLE系列-第四篇】從零剖析L2CAP:信道、Credit流控、指令詳解

目錄 引言 一、L2CAP主要功能 二、L2CAP幀格式及信道概念 2.1 邏輯鏈路是什么&#xff1f; 2.2 邏輯信道的作用 2.3 L2CAP幀格式介紹 三、L2CAP信令信道 3.1 信令信道幀格式說明 3.2 信令信道指令介紹 3.2.1 信令信道指令一覽表 3.2.2 Credit流控規則 引言 在BLE協…

CSS保持元素寬高比,固定元素寬高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">這里是正文內容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 寬高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …