Python學習——字典和文件

? ? ? ? 前面python的學習中我們已經學習了python的函數和列表元組相關的內容,接下來我們來學習剩下的python語法:字典和文件

? ? ? ? 相關代碼已經上傳到作者的個人gitee:樓田莉子/Python 學習喜歡請點個贊謝謝

目錄

字典

? ? ? ? 創建字典

? ? ? ? 查找key

? ? ? ? 新增/修改元素

? ? ? ? 刪除元素

? ? ? ? 遍歷字典

? ? ? ? 取出所有的key和value

? ? ? ? 合法的key類型

文件

? ? ? ? 什么是文件?

? ? ? ? 文件路徑

? ? ?絕對路徑和相對路徑? ?????

1. 絕對路徑 (Absolute Path)

2. 相對路徑 (Relative Path)

如何表示:語法總結

????????命令行應用

如何選擇?

????????文件操作

? ? ? ? 打開文件

? ? ? ? 關閉文件

? ? ? ? 寫文件

? ? ? ? 讀文件

????????? ? ? ? 關于中文的處理

上下文管理器


字典

????????字典是一種存儲 鍵值對 的結構.

????????啥是鍵值對? 這是計算機/生活中一個非常廣泛使用的概念.

????????把 鍵(key) 和 值(value) 進行一個一對一的映射, 然后就可以根據鍵, 快速找到值.

? ? ? ? python中字典的關系類似于C++中的鍵值對,類似于map、unordered_map

? ? ? ? python中字典有很多鍵值對,且鍵不能重復

? ? ? ? 創建字典

????????創建一個空的字典. 使用 { } 表示字典

a = { }
b = dict()
print(type(a))
print(type(b))

? ? ? ? 結果為:

????????也可以在創建的同時指定初始值

????????鍵值對之間使用 , 分割, 鍵和值之間使用 : 分割. (冒號后面推薦加一個空格).

????????使用 print 來打印字典內容

student={1:"張三",2:"李四",3:"王五"}
print(student)

? ? ? ? 結果為:

????????最后一個鍵值對, 后面可以寫 , 也可以不寫.

? ? ? ? 查找key

????????使用 in 可以判定 key 是否在 字典 中存在. 返回布爾值

#用in判定是否存在
#這里的“\”表示換行,刪掉就會報錯
student = \{'id': 1,'name': 'zhangsan',}
print('id' in student)
print('score' in student)

? ? ? ? 結果為:

????????使用 [ ] 通過類似于取下標的方式, 獲取到元素的值. 只不過此處的 "下標" 是 key. (可能是整數, 也可能是字符串等其他類型).

#這里的“\”表示換行,刪掉就會報錯
student = \{'id': 1,'name': 'zhangsan',}
#用[]獲取鍵值
print(student['id'])
print(student['name'])

? ? ? ? 結果為:

????????如果 key 在字典中不存在, 則會拋出異常.
?

#這里的“\”表示換行,刪掉就會報錯
student = \{'id': 1,'name': 'zhangsan',}
#如果不存在則拋異常
print(student['score'])

? ? ? ? 新增/修改元素

????????使用 [ ] 可以根據 key 來新增/修改 value.

????????如果 key 不存在, 對取下標操作賦值, 即為新增鍵值對

student = \{'id': 1,'name': 'zhangsan',}
student['score'] = 90
print(student)

? ? ? ? 結果為:

????????如果 key 已經存在, 對取下標操作賦值, 即為修改鍵值對的值

student = {'id': 1,'name': 'zhangsan','score': 80
}
student['score'] = 90
print(student)


? ? ? ? 刪除元素

????????使用 pop 方法根據 key 刪除對應的鍵值對

#刪除元素
#使用 pop 方法根據 key 刪除對應的鍵值對
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
student.pop('score')
print(student)

? ? ? ? 遍歷字典

????????直接使用 for 循環能夠獲取到字典中的所有的 key, 進一步的就可以取出每個值了

#遍歷字典元素
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
for key in student:print(key, student[key])

? ? ? ? 結果為:

????????

? ? ? ? 取出所有的key和value

????????使用 keys 方法可以獲取到字典中的所有的 key
?

student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
#取出所有key和value
print(student.keys())

? ? ? ? 結果為:? ? ? ?

????????此處 dict_keys 是一個特殊的類型, 專門用來表示字典的所有 key. 大部分元組支持的操作對于

dict_keys 同樣適用.

????????使用 values 方法可以獲取到字典中的所有 value

student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
#取出所有key和value
print(student.values())

????????此處 dict_values 也是一個特殊的類型, 和 dict_keys 類似.
?

????????使用 items 方法可以獲取到字典中所有的鍵值對.

student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
print(student.items())


????????此處 dict_items 也是一個特殊的類型, 和 dict_keys 類似.
?

? ? ? ? 合法的key類型

? ? ? ? 類似于C++中的字典本質上是一個 哈希表, 哈希表的 key 要求是 "可哈希的", 也就是可以計算出一個哈希值.

????????不是所有的類型都可以作為字典的 key.
????????可以使用 hash 函數計算某個對象的哈希值.

????????但凡能夠計算出哈希值的類型, 都可以作為字典的 key.

#計算是否為合法key
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash(())) # ( ) 是一個空的元組

? ? ? ? 以下結果表明均為合法的key類型

????????列表無法計算哈希值.

????????

print(hash([1, 2, 3]))

????????字典也無法計算哈希值

print(hash({ 'id': 1 }))

文件

? ? ? ? 什么是文件?

????????變量是把數據保存到內存中. 如果程序重啟/主機重啟, 內存中的數據就會丟失.要想能讓數據被持久化存儲, 就可以把數據存儲到硬盤中. 也就是在 文件 中保存.

????????在 Windows "此電腦" 中, 看到的內容都是 文件.

????????通過文件的后綴名, 可以看到文件的類型. 常見的文件的類型如下:文本文件 (txt)

????????可執行文件 (exe, dll)圖片文件 (jpg, gif)

????????視頻文件 (mp4, mov) office 文件 (.ppt, docx)

????????......

? ? ? ? 而接下來我們將介紹最簡單的文件格式

? ? ? ? 文件路徑

????????一個機器上, 會存在很多文件, 為了讓這些文件更方面的被組織, 往往會使用很多的 "文件夾"(也叫做目錄)來整理文件.

????????實際一個文件往往是放在一系列的目錄結構之中的.

????????為了方便確定一個文件所在的位置, 使用 文件路徑 來進行描述.

? ? ? ? 如以下的路徑

D:\program\qq\Bin\QQ.exe 來表示.

????D: 表示 盤符. 不區分大小寫.

????????每一個 \ 表示一級目錄. 當前 QQ.exe 就是放在 "D 盤下的 program 目錄下的 qq 目錄下的 Bin 目錄中" .

????????目錄之間的分隔符, 可以使用 \ 也可以使用 / . 一般在編寫代碼的時候使用 / 更方便.

? ? ?絕對路徑和相對路徑? ?????

  • 絕對路徑:從“根目錄”開始,描述文件位置的完整路徑。它就像是一個文件在文件系統中的完整郵寄地址

  • 相對路徑:從“當前所在目錄”開始,描述文件位置的相對路徑。它就像是在一個商場里,別人告訴你“我在你樓上的奶茶店”,這個指引依賴于你“當前的位置”。

1. 絕對路徑 (Absolute Path)
  • 是什么:從根目錄C:\?或?/)開始,一層不落地寫到目標文件。

  • 怎么表示

    • Windows:?C:\Users\ming\Desktop\my_essay.docx

    • Mac/Linux:?/Users/ming/Desktop/my_essay.docx

  • 特點

    • 唯一性:這個文件的絕對路徑在全宇宙只有這一個。

    • 絕對性無論你當前在哪個目錄,只要你使用這個絕對路徑,系統就一定能精準定位到它。

    • 開頭:Windows通常以盤符(如C:\)開頭;Mac/Linux以正斜杠(/)開頭。

比喻:就像告訴別人你的完整地址:“中國北京市海淀區XX路XX號XX大廈10樓1001室”。無論這個人現在在世界的哪個角落,憑借這個地址都能找到你。

2. 相對路徑 (Relative Path)
  • 是什么:從你當前所在的目錄出發,如何找到目標文件。

  • 怎么表示(基于當前目錄是?Desktop):

    • 目標文件就在當前目錄下,直接寫文件名:my_essay.docx

    • 想表示“當前目錄”本身,可以用一個點:./my_essay.docx./?代表“在這里”)

    • 想進入當前目錄的子目錄(這里Desktop沒有子目錄,所以用Downloads舉例):如果當前在ming目錄,去Downloads就是?Downloads/game.zip

    • 想返回上一級目錄,用兩個點:../../?代表“上一層”)

      • 比如,你現在在Desktop,想找到Downloads里的game.zip,你需要先退回上一層(ming目錄),再進入Downloads。路徑就是:../Downloads/game.zip

  • 特點

    • 相對性:它的有效性嚴重依賴你當前的位置。如果你不在Desktop目錄,那么my_essay.docx這個相對路徑就失效了。

    • 簡潔性:通常比絕對路徑短得多,寫起來更方便。

如何表示:語法總結

符號含義示例 (假設當前目錄是?/Users/ming/Desktop)
絕對路徑從根目錄開始/Users/ming/Desktop/my_essay.docx
[文件名]當前目錄下的文件my_essay.docx
./當前目錄本身(通常可省略)./my_essay.docx?(等價于?my_essay.docx)
../上一級目錄../?指向?/Users/ming/
../../上兩級目錄../../?指向?/Users/
[文件夾名]/當前目錄下的某個子文件夾(如果存在)?Projects/my_app.py

????????命令行應用

# 當前在 Desktop 目錄
# 用絕對路徑打開文件(無論在哪都能執行)
$ open /Users/ming/Desktop/my_essay.docx      # Mac
> start C:\Users\ming\Desktop\my_essay.docx   # Windows# 用相對路徑打開文件(必須在Desktop目錄或其父目錄執行才有效)
$ open ./my_essay.docx    # Mac
$ open my_essay.docx      # 省略 ./
> start my_essay.docx     # Windows

? ? ? ? python中應用

# 使用絕對路徑(更可靠)
file = open("/Users/ming/Desktop/my_essay.docx", "r")# 使用相對路徑(假設程序運行時,當前目錄就是Desktop)
file = open("my_essay.docx", "r")# 使用相對路徑,從上一級目錄的Downloads文件夾讀取
file = open("../Downloads/game.zip", "rb")

如何選擇?

  • 用絕對路徑:當你需要確保萬無一失的精準定位時,比如在腳本、程序配置或日志中記錄文件位置。

  • 用相對路徑:當你在項目內部移動或引用文件時,這樣可以使整個項目更容易被移動或共享(因為路徑不依賴于項目在電腦上的具體位置)。

????????文件操作

? ? ? ? 打開文件

????????使用內建函數 open 打開一個文件.

f=open('D:\Python\python---learning\hello world.txt','r')


????????第一個參數是一個字符串, 表示要打開的文件路徑

????????第二個參數是一個字符串, 表示打開方式. 其中 r 表示按照讀方式打開. w 表示按照寫方式打開. a表示追加寫方式打開.

????????如果打開文件成功, 返回一個文件對象. 后續的讀寫文件操作都是圍繞這個文件對象展開.

????????如果打開文件失敗(比如路徑指定的文件不存在), 就會拋出異常

? ? ? ? 關閉文件

????????使用 close 方法關閉已經打開的文件

f.close()


? ? ? ? 使用完一定要關閉文件!

????????如果一直循環的打開文件, 而不去關閉的話, 就會出現下述報錯.

????????當一個程序打開的文件個數超過上限, 就會拋出異常.

????????注意: 上述代碼中, 使用一個列表來保存了所有的文件對象. 如果不進行保存, 那么 Python 內置的垃圾回收機制, 會在文件對象銷毀的時候自動關閉文件.

????????但是由于垃圾回收操作不一定及時, 所以我們寫代碼仍然要考慮手動關閉, 盡量避免依賴自動關閉

? ? ? ? 寫文件

????????文件打開之后, 就可以寫文件了.

????????寫文件, 要使用寫方式打開, open 第二個參數設為 'w'

????????使用 write 方法寫入文件.

f = open(r'D:/Python/python---learning/hello world.txt', 'w')
f.write('詩華')
f.close()

????????如果是使用 'r' 方式打開文件, 則寫入時會拋出異常.
? ? ? ? 使用’w‘方式打開文件成功會清除原有數據

????????使用’a‘實現“追加寫”,原有內容不變,直接在后面家內容

f = open(r'D:/Python/python---learning/hello world.txt', 'a')
f.write('詩華')
f.close()
f = open(r'D:/Python/python---learning/hello world.txt', 'w')
f.write('詩華')
f.close()

????????針對已經關閉的文件對象進行寫操作, 也會拋出異常.
?

? ? ? ? 讀文件

? ? ? ? 讀文件需要使用’r‘的方式打開文件

? ? ? ? 使用read方法完成“讀”操作,參數為幾個字符

f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()

????????如果文件是多行文本, 可以使用 for 循環一次讀取一行.
?

f = open('d:/test.txt', 'r')
for line in f:print(f'line = {line}')
f.close()

? ? ? ? 注意:print()函數默認帶換行符

????????使用 print(f'line = {line}', end='') 手動把 print 自帶的換行符去掉.

????????

????????使用 readlines 直接把文件整個內容讀取出來, 返回一個列表. 每個元素即為一行.

f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()

????????此處的 \n 即為換行符.

????????
? ? ? ? 關于中文的處理

????????當文件內容存在中文的時候, 讀取文件內容不一定就順利.同樣上述代碼, 有的同學執行時可能會出現異常,有的則會出現亂碼、

????????計算機表示中文的時候, 會采取一定的編碼方式, 我們稱為 "字符集"

????????所謂 "編碼方式" , 本質上就是使用數字表示漢字.

????????我們知道, 計算機只能表示二進制數據. 要想表示英文字母, 或者漢字, 或者其他文字符號, 就都要通過編碼.

????????最簡單的字符編碼就是 ascii. 使用一個簡單的整數就可以表示英文字母和阿拉伯數字.

????????但是要想表示漢字, 就需要一個更大的碼表.

????????一般常用的漢字編碼方式, 主要是 GBK 和 UTF-8

????????必須要保證文件本身的編碼方式, 和 Python 代碼中讀取文件使用的編碼方式匹配, 才能避免出現上述問題.

????????Python3 中默認打開文件的字符集跟隨系統, 而 Windows 簡體中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的編碼, 直接就能正確處理.

????????如果文件本身是其他編碼(比如 UTF-8), 那么直接打開就可能出現上述問題

????????用記事本打開文本文件, 在 "菜單欄" -> "文件" -> "另存為" 窗口中, 可以看到當前文件的編碼方式

? ? ? ? 如果此時為ASNI,表示GBK編碼

???????? 如果此時為UTF-8,表示UTF-8編碼

? ? ? ? 此時可以給open方法加上encoding,顯示指定與文本相同的字符集,即可解決

? ? ? ? 更具體的可以參考這個文檔:(47 封私信 / 58 條消息) 程序員必備:徹底弄懂常見的7種中文字符編碼 - 知乎https://zhuanlan.zhihu.com/p/46216008

上下文管理器

????????打開文件之后, 是容易忘記關閉的. Python 提供了 上下文管理器 , 來幫助程序猿自動關閉文件.使用 with 語句打開文件.

????????當 with 內部的代碼塊執行完畢后, 就會自動調用關閉方法.

with open('d:/test.txt', 'r', encoding='utf8') as f:lines = f.readlines()print(lines)

????????

? ? ? ? 本期內容到這里就結束了,到此python的基礎語法就結束了。

? ? ? ? 喜歡請點個贊,謝謝

封面圖自取:

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

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

相關文章

swiper插件的使用

官方網址:https://www.swiper.com.cn/ 1、點擊導航欄,獲取Swiper里邊的下載Swiper 2、選擇要下載的版本【本次案例版本5.4.5】,然后解壓縮文件夾,拿到swiper.min.js和swiper.min.css文件,放到項目對應的css文件和js文…

Vue3+JS 組合式 API 實戰:從項目痛點到通用 Hook 封裝

Vue3 組合式 API 的實戰技巧 —— 組合式 API 幫我解決了不少 Options API 難以應對的問題,尤其是在代碼復用和復雜組件維護上。一、為什么放棄 Options API?聊聊三年項目里的真實痛點?剛接觸 Vue3 時,我曾因 “慣性” 繼續用 Options API 寫…

把 AI 塞進「電梯按鈕」——基于 64 kB 零樣本聲紋的離線故障預測按鈕

標簽:零樣本聲紋、電梯按鈕、離線 AI、TinyML、RISC-V、低功耗、GD32V303、故障預警 ---- 1. 背景:為什么按鈕要「聽聲音」? 全國 700 萬臺電梯,按鈕故障率 0.3 %/年,卻常出現: ? 機械卡滯、觸點氧化&…

清華大學聯合項目 論文解讀 | MoTo賦能雙臂機器人:實現零樣本移動操作

研究背景 移動操作是機器人領域的核心挑戰,它使機器人能夠在各種任務和動態日常環境中為人類提供幫助。傳統的移動操作方法由于缺乏大規模訓練,往往難以在不同任務和環境中實現泛化。而現有操作基礎模型雖在固定基座任務中表現出強泛化性,卻無…

go webrtc - 2 webrtc重要概念

webrtc是一套音視頻傳輸技術生態,不是一個協議或一個什么東西。3種模式本文基于 SFU 形式闡述!重要概念:sfu 服務負責:信令 服務負責:peerConnection:track:房間:虛擬分組概念用戶&a…

“下游任務”概念詳解:從定義到應用場景

“下游任務”概念詳解:從定義到應用場景 一、什么是“下游任務”? 在機器學習(尤其是深度學習)中,“下游任務”(Downstream Task)是相對“上游過程”而言的目標任務——可以理解為:我…

視頻怎么做成 GIF?用 oCam 一鍵錄制 GIF 動畫超簡單

GIF 動圖因其生動直觀、無需點擊播放的特點,越來越受歡迎。你是否也曾看到一段有趣的視頻,想把它做成 GIF 發給朋友或用在PPT里?其實,將視頻片段轉換為 GIF 并不需要復雜的視頻剪輯技術,使用一款支持直接錄制為 GIF 的…

Vue.config.js中的Webpack配置、優化及多頁面應用開發

Vue.config.js中的Webpack配置、優化及多頁面應用開發 在Vue CLI 3項目中,vue.config.js文件是工程化配置的核心入口,它通過集成Webpack配置、優化策略和多頁面開發支持,為項目構建提供高度可定制化的解決方案。本文將從基礎配置、性能優化、…

行業學習【電商】:直播電商的去頭部化、矩陣號?

聲明:以下部分內容含AI生成這兩個詞是當前直播電商和MCN領域的核心戰略,理解了它們就理解了行業正在發生的深刻變化。一、如何理解“去頭部化”?“去頭部化” 指的是平臺或MCN機構有意識地減少對超頭部主播(如曾經的李佳琦、薇婭&…

【MFC視圖和窗口基礎:文檔/視圖的“雙胞胎”魔法 + 單文檔程序】

大家好,我是你的MFC編程小伙伴!學MFC就像探險古墓:到處是神秘的“房間”(窗口)和“寶藏”(數據)。今天咱們聊聊核心概念 – 視圖、窗口和文檔。這些是MFC的“骨架”,懂了它們&#x…

深度學習(六):代價函數的意義

在深度學習的浩瀚世界中,代價函數(Cost Function),又稱損失函數(Loss Function)或目標函數(Objective Function),扮演著至關重要的角色,它就像一個導航員&…

Kable使用指南:Android BLE開發的現代化解決方案

概述 Kable(com.juul.kable:core)是一個專為Android藍牙低功耗(BLE)開發設計的Kotlin協程友好庫。它通過提供簡潔的API和響應式編程模式,極大地簡化了BLE設備交互的復雜性。本文將詳細介紹Kable的使用方法,…

Android圖案解鎖繪制

使用到的庫是Pattern Locker,根據示例進行了修改,把默認樣式和自定義樣式進行了合并調整。 設置密碼 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xm…

Kotlin 協程之 Flow 的理解使用及源碼解析

前言 在前面的文章中&#xff0c;我們已經討論了 Channel 的概念和基本使用以及 Channel 的高階應用。這篇我們來看日常開發中更常用的Flow。 “冷流” 和 “熱流” 的本質 先來梳理一下所謂的 “冷流” 和 “熱流”。 核心概念 我們已經知道 Channel 是 “熱流”&#xff…

簡述ajax、node.js、webpack、git

本系列可作為前端學習系列的筆記&#xff0c;HTML、CSS和JavaScript系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點贊關注不迷路&#xff01;您的點贊、關注和收藏是對小編最大的支持和鼓勵&#xff01; 系列文章目錄 簡述ajax、…

經營幫會員經營:全方位助力企業高效發展,解鎖商業新可能

在商業競爭愈發激烈的當下&#xff0c;企業若想脫穎而出&#xff0c;高效的經營管理體系至關重要。經營幫的會員經營板塊&#xff0c;憑借豐富且實用的功能&#xff0c;為企業打造了一站式的經營助力平臺&#xff0c;從多維度賦能企業&#xff0c;讓發展之路更順暢。會員經營與…

Vue 封裝Input組件 雙向通信

子組件<template><div class"box"><div class"box-left"><input blur"handleBlur" v-model"localInput" class"box-left-input"> </div><div class"box-right"><p style…

伽馬(gamma)變換記錄

此只記錄伽馬變換原理及其應用結果&#xff08;文章所有內容基于數字圖像處理-岡薩雷斯&#xff09;&#xff0c;和直接用MATLAB代碼生成伽馬變換代碼。一、原理伽馬變換的公式很簡答 就是一個有規律的冪運算 公式如下&#xff1a;一般在圖像中進行應用是 C1 y為不同值時r的輸…

電路學習(六)三極管

三極管是一種電流驅動元器件&#xff08;MOS管為電壓驅動&#xff09;&#xff0c;在電路中可以充當開關&#xff0c;放大電流等作用。本文章參考了尚硅谷的視頻資料。1. 什么是三極管&#xff1f;三極管又被稱為晶體三極管&#xff08;Bipolar Junction Transistor&#xff0c…

配置docker常見問題

輸入sudo yum install -y yum-utils device-mapper-persistent-data lvm2出現Cannot find a valid baseurl for repo: base/7/x86_64一、檢查網絡輸入ping www.baidu.com出現PING www.a.shifen.com (220.181.111.1) 56(84) bytes of data. 64 bytes from 220.181.111.1 (220.18…