? ? ? ? 前面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的基礎語法就結束了。
? ? ? ? 喜歡請點個贊,謝謝
封面圖自取: