1.集合 使用{}存盤
主要作用:
①去重,把兩個串列變成集合,就自動去重了
②關系測驗,測驗兩組資料之前的交集、差集、并集等關系
將串列轉化為集合,set命令強制轉換即可
關系運算:
交集:intersection命令 或 &
并集:union命令 或 |
差集:difference命令 或 -
子集:issubset命令
父集:issuperset命令
對稱差集:symmetric_difference命令 或 ^,對于A、B兩個集合,該命令輸出為A∪B-A∩B(將兩個集合里分別獨有的元素取出來放在一起)
判斷兩集合是否有相同元素:isdisjoint命令
#以上操作不更改原集合
#以下操作更改原集合
添加一項元素:add命令
添加多項元素:update命令配合串列
洗掉一項元素:remove命令(元素不存在報錯)/discard命令(元素不存在回傳None)/pop命令 隨機洗掉,回傳洗掉的元素值
長度:len命令
判斷元素在集合內:in 命令
判斷元素不在集合內: not in命令
intersection_update:求交集并將其更新在原集合中(intersection是生成在新集合中不改變原集合)
difference_update、symmetric_difference_update同理
1 list1 = [1, 3, 4, 7, 5, 3, 9] 2 A = set(list1) 3 print(list1, type(list1)) 4 list2 = [2, 22, 66, 4, 7, 55] 5 B = set(list2) 6 print('集合A:', A, '\n', '集合B:', B) 7 print("\033[31m下面是集合操作\033[0m".center(30, '-')) 8 # 交集 9 print('A、B求交', A.intersection(B), A & B) 10 # 并集 11 print('A、B求并:', A.union(B), A | B) 12 # 差集 13 print('A-B:', A.difference(B), A - B) 14 print('B-A:', B.difference(A), B - A) 15 # 子集 16 print('A是B的子集?', A.issubset(B)) 17 # 父集 18 print('A是B的父集?', A.issuperset(B)) 19 # 對稱差集 20 print('對稱差集', A.symmetric_difference(B), A ^ B) 21 # 判斷兩集合是否有相同元素 22 print(A.isdisjoint(B)) 23 print("\033[31m結束\033[0m".center(30, '-')) 24 print(A, B) # 上述集合操作并未更改原集合 25 26 # 添加一項元素 27 A.add('WK') 28 print(A) 29 # 添加多項元素 30 A.update([444, 666, 888]) 31 print(A) 32 # 洗掉一項元素 33 A.remove('WK') 34 print(A) 35 # 某元素是否在集合內 36 print("WK" in A) 37 print("WK" not in A) 38 print(A.pop()) 39 print(A) 40 A.discard(888) 41 print(A)Set
1 [1, 3, 4, 7, 5, 3, 9] <class 'list'> 2 集合A: {1, 3, 4, 5, 7, 9} 3 集合B: {2, 66, 4, 7, 22, 55} 4 -------下面是集合操作------- 5 A、B求交 {4, 7} {4, 7} 6 A、B求并: {1, 2, 3, 4, 5, 66, 7, 9, 22, 55} {1, 2, 3, 4, 5, 66, 7, 9, 22, 55} 7 A-B: {1, 3, 5, 9} {1, 3, 5, 9} 8 B-A: {2, 66, 22, 55} {2, 66, 22, 55} 9 A是B的子集? False 10 A是B的父集? False 11 對稱差集 {1, 2, 66, 3, 5, 9, 22, 55} {1, 2, 66, 3, 5, 9, 22, 55} 12 False 13 ---結束,上述操作并未更改原集合---- 14 {1, 3, 4, 5, 7, 9} {2, 66, 4, 7, 22, 55} 15 {1, 3, 4, 5, 'WK', 7, 9} 16 {1, 3, 4, 5, 'WK', 7, 9, 888, 666, 444} 17 {1, 3, 4, 5, 7, 9, 888, 666, 444} 18 False 19 True 20 1 21 {3, 4, 5, 7, 9, 888, 666, 444} 22 {3, 4, 5, 7, 9, 666, 444}Output-set
2.檔案操作
打開檔案:
open(‘檔案名’) 可指定打開方式(只讀、讀寫……)、編碼方式(encoding = ‘編碼方式’)、等
檔案讀寫:
不同的打開方式對比如下:
| 模式 | 描述 |
| t | 文本模式 (默認) |
| x | 寫模式,新建一個檔案,如果該檔案已存在則會報錯 |
| b | 二進制模式 |
| + | 打開一個檔案進行更新(可讀可寫) |
| U | 通用換行模式(不推薦) |
| r | 以只讀方式打開檔案,檔案的指標將會放在檔案的開頭,這是默認模式 |
| rb | 以二進制格式打開一個檔案用于只讀,檔案指標將會放在檔案的開頭,這是默認模式,一般用于非文本檔案如圖片等 |
| r+ | 打開一個檔案用于讀寫,檔案指標將會放在檔案的開頭 |
| rb+ | 以二進制格式打開一個檔案用于讀寫,檔案指標將會放在檔案的開頭,一般用于非文本檔案如圖片等 |
| w | 打開一個檔案只用于寫入,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案 |
| wb | 以二進制格式打開一個檔案只用于寫入,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案,一般用于非文本檔案如圖片等 |
| w+ | 打開一個檔案用于讀寫,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案 |
| wb+ | 以二進制格式打開一個檔案用于讀寫,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案,一般用于非文本檔案如圖片等 |
| a | 打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,也就是說,新的內容將會被寫入到已有內容之后,如果該檔案不存在,創建新檔案進行寫入 |
| ab | 以二進制格式打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,也就是說,新的內容將會被寫入到已有內容之后,如果該檔案不存在,創建新檔案進行寫入 |
| a+ | 打開一個檔案用于讀寫,如果該檔案已存在,檔案指標將會放在檔案的結尾,檔案打開時會是追加模式,如果該檔案不存在,創建新檔案用于讀寫 |
| ab+ | 以二進制格式打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,如果該檔案不存在,創建新檔案用于讀寫 |
二進制模式常用于網路傳輸
r+讀寫模式的一個注意點:如果打開后不讀直接寫,會從頭開始覆寫;如果讀一部分(指標不在開始位置了),再寫就會變成追加
讀取一行:readline命令 讀取某幾行:回圈加判斷即可 (檔案操作時,務必注意打開方式)
讀取全部:readlines命令 將檔案內容讀取至串列內
查看指標位置:tell命令
讀取指標回歸檔案開始位置:seek(0)
其他:
isatty命令:檔案是否連接到一個終端設備
fileno命令: 回傳一個整型的檔案描述符(file descriptor FD 整型),可用于底層作業系統的 I/O 操作
encoding命令:檔案編碼方式
name命令:回傳檔案名稱
seekable命令:檔案讀取指標是否可移動
readable\writale命令:檔案是否可讀/可寫
flush命令:用來重繪緩沖區的,即將緩沖區中的資料立刻寫入檔案,同時清慷訓沖區,不需要是被動的等待輸出緩沖區寫入,一般情況下,檔案關閉后會自動重繪緩沖區,但有時需要在關閉前重繪它,這時就可以使用 flush() 方法,
1 # low loop 列印yesterday檔案內的第36行內容 2 f = open('yesterday', encoding='utf-8') # 檔案句柄 3 for i, line in enumerate(f.readlines()): # readlines命令將檔案內容讀取并存盤至串列內 4 if i == 35: 5 print(line.strip()) 6 else: 7 continue 8 f.close() 9 # 用以上readlines命令,要先將所有內容讀取一遍到記憶體里/或readline命令,最后也是把所有內容都存到記憶體里,故只能處理小檔案 10 11 # 改進 12 f = open('yesterday', encoding='utf-8') 13 count = 0 14 for line in f: 15 count += 1 16 if count == 36: 17 print(line.strip()) 18 else: 19 continue 20 f.close() 21 # 用以上命令,記憶體每次存盤一行內容(涉及迭代器,后續學習) 22 23 f = open('yesterday', encoding='utf-8') 24 f.readline() 25 print(f.tell()) # 查看指標位置 26 print(f.readline().strip()) 27 f.seek(0) # 指標回歸檔案開頭 28 print(f.readline().strip()) 29 f.close() 30 31 f = open('yesterday', 'r+', encoding='utf-8') 32 print(f.tell()) 33 f.write('奇奇怪怪') 34 print(f.tell()) 35 f.close() 36 37 f = open('yesterday', 'r+', encoding='utf-8') 38 f.readline() 39 f.write('奇奇怪怪') 40 print(f.tell()) 41 f.close()file_operate
有趣的小例子:列印進度條
1 import sys 2 import time 3 4 for i in range(100): 5 sys.stdout.write('*') # print每次輸出后會自動換行 6 sys.stdout.flush() # 即時重繪緩沖區而非完成后統一寫入 7 time.sleep(0.1) # 推遲執行的秒數,使輸出程序顯示更清晰進度條
truncate命令:截斷命令(截斷位置后的內容清除) 可以指定開始位置,不指定則從頭開始(指定位置時不以指標位置為標準,始終從頭開始計算)
檔案修改:
思路:如果全部讀取至記憶體中,對于大檔案來說,耗時太長且可能記憶體不夠;故逐行讀取,對不需修改的內容,直接讀取并寫入另一檔案,對需要修改的內容,修改后寫入另一檔案,最終生成的新檔案為內容修改后的檔案(故修改程序需要兩個檔案)
1 f = open('yesterday', 'r', encoding='utf-8') 2 f_new = open('yesterday_new', 'w+', encoding='utf-8') 3 4 for line in f: 5 if "奇奇怪怪" in line: 6 line = line.replace("奇奇怪怪", "When I was young (當我小時候)") 7 f_new.write(line) 8 f.close() 9 f_new.seek(0) 10 update = f_new.read() 11 f = open('yesterday', 'w', encoding='utf-8') 12 f.write(update) 13 f.close() 14 f_new.close()file_mod
with陳述句:
為了避免打開檔案后忘記關閉,可以通過管理背景關系,即:
with open(‘檔案名’,’打開方式’,encoding = ‘編碼方式’) as …:(可通過逗號隔開同時打開多個檔案)
檔案操作…
執行完畢自動關閉檔案
3.字符編碼與轉碼
詳細文章:https://www.cnblogs.com/luotianshuai/articles/5735051.html
查看當前默認編碼方式:匯入sys模塊后用sys.getdefaultencoding命令
查看編碼方式:chardet模塊下detect命令
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/4501.html
標籤:Python
下一篇:字串的一些簡單運用
