Python基礎(集合用法、檔案操作、字元編碼轉換、函式)
阿新 • • 發佈:2018-12-24
集合(Set)及其函式
集合是一個無序的、無重複元素的序列。
1 list = {1, 3, 6, 5, 7, 9, 11, 3, 7} # 定義集合方式一 2 list1 = set([1, 3, 6, 5, 7, 9, 11, 3, 7]) # 定義集合方式二 3 list2 = set() # 定義一個空集合 4 5 print(list1, list) # 列印後可看到,集合中的元素已自動去重 6 print(3 in list) # 判斷一個元素是否在集合中,返回bool值 7 print(20 not in list1) # 判斷一個元素是否不在集合中,返回bool值8 list1.add(99) # 新增元素 9 list1.update([10, 20, 30, 2]) # 新增多項 10 list1.remove(3) # 刪除一個元素,若元素不存在則報錯 11 print(list1.discard(8)) # 刪除一個元素,若元素不存在則不做任何操作 12 print(len(list1)) # 計算集合中元素的個數 13 print(list1.pop()) # 從集合中隨機彈出一個元素 14 list.clear() # 清空集合
集合的運算
1 list1 = set([1, 3, 6, 5, 7, 9, 11, 3, 7])2 list2 = set([2, 4, 6, 8, 3, 5]) 3 print(list1, list2) 4 5 # 交集 6 print(list1.intersection(list2)) 7 print(list1 & list2) 8 # 並集 9 print(list1.union(list2)) 10 print(list1 | list2) 11 # 差集 12 print(list1.difference(list2)) 13 print(list1 - list2) 14 # 對稱差集 15 print(list1.symmetric_difference(list2))16 print(list1 ^ list2) 17 18 # 是否為子集 是否為父集 19 list3 = set([9, 11]) 20 print(list3.issubset(list1)) 21 print(list1.issuperset(list3)) 22 23 # 若兩個集合的交集為空 返回true 24 list4 = set([20, 30]) 25 print(list1.isdisjoint(list4)) 26 print(list1.isdisjoint(list2))
檔案(File)操作
在開發中經常會有讀寫檔案的需求,相關的程式碼實現如下:
檔案的開啟模式
1 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
mode | description |
t | 文字模式 (預設)。 |
x | 寫模式,新建一個檔案,如果該檔案已存在則會報錯。 |
b | 二進位制模式。 |
+ | 開啟一個檔案進行更新(可讀可寫)。 |
U | 通用換行模式(不推薦)。 |
r | 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。一般用於非文字檔案如圖片等。 |
r+ | 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。一般用於非文字檔案如圖片等。 |
w | 開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
wb | 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。一般用於非文字檔案如圖片等。 |
w+ | 開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。一般用於非文字檔案如圖片等。 |
a | 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
ab | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
a+ | 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 |
ab+ | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 |
檔案的讀操縱、寫操作、追加操作、按行讀取檔案
1 # read 直接讀檔案全文 2 f = open('test', 'r', encoding='utf-8') # 檔案控制代碼 3 data = f.read() 4 print(data) 5 6 # write 向檔案中寫 7 f = open('test1', 'w', encoding='utf-8') 8 f.write('我愛北京天安門,\n天安門上太陽升') 9 10 # append 在檔案最後追加內容 11 f = open('test1', 'a', encoding='utf-8') 12 f.write('呀呼嘿') 13 14 # loop 按行讀取檔案 15 # high bigger 將檔案作為迭代器 讀一行列印一行 記憶體中只快取一行 16 f = open('test', 'r', encoding='utf-8') 17 count = 0 18 for l in f: 19 if count == 9: 20 print('----------') 21 count += 1 22 continue 23 print(l.strip()) 24 count += 1 25 26 # low loop 將檔案內容全部讀取至記憶體,效率低 27 28 f = open('Sonnet', 'r', encoding='utf-8') 29 for index, line in enumerate(f.readlines()): 30 if index == 9: 31 print('------------') 32 continue 33 print(line.strip())
檔案的函式
1 f = open('test', 'r', encoding='utf-8') # 檔案控制代碼 讀模式開啟檔案 2 print(f.tell()) # 獲取當前游標位置 3 print(f.readline()) 4 print(f.readline()) 5 print(f.tell()) 6 print(f.readline()) 7 f.seek(10) # 跳轉游標到第10個字元 8 print(f.readline()) 9 print(f.encoding) # 獲取檔案編碼 10 print(f.fileno()) # i don't know what it is 11 print(f.isatty()) # 判斷檔案是否是tty終端 12 print(f.readable()) # 判斷檔案是否是可讀 13 print(f.writable()) # 判斷檔案是否是可寫 14 print(f.seekable()) # 判斷檔案是否是可跳轉游標 (tty不可跳轉 15 f.flush() # 當用寫模式開啟檔案時 並不是寫一句系統就會呼叫一次io 若需要及時重新整理硬碟中的檔案內容 可以呼叫該函式 16 f.close() # 關閉檔案 17 print(f.closed) # 判斷檔案是否關閉
檔案的修改***
1 # 檔案的修改 直接修改檔案本身比較困難 可以將修改寫入另一個檔案中 如有需求可以再寫回檔案本身 2 f = open('test', 'r', encoding='utf-8') 3 f_new = open('test.bak', 'w', encoding='utf-8') 4 5 for line in f: 6 if '我曾千萬次夢見' in line: 7 line = line.replace('我曾千萬次夢見', '我不想千萬次夢見') 8 f_new.writelines(line) 9 10 f.close() 11 f_new.close()
一個進度條例項 用於理解flush函式的機制 該例項可以實現進度條效果
1 import sys 2 import time 3 4 f = open('Sonnet1', 'w', encoding='utf-8') # 檔案控制代碼 寫模式開啟檔案 會新建一個檔案 若同名檔案存在 則直接覆蓋 5 for i in range(10): 6 sys.stdout.write('#') 7 sys.stdout.flush() 8 time.sleep(0.2)