Python自動化開發學習2-2
集合
創建集合可以用set(),或者直接用{}
set_a = set([1,2,3,4,5]) set_b = {1,3,5,7,9} print(set_a) print(set_b) print(type(set_a),type(set_b))
集合同樣也有各種操作,就記幾個符號的。別的到用的時候再去查吧
set_a = set([1,2,3,4,5]) set_b = {1,3,5,7,9} print(set_a | set_b) # 並集 print(set_a & set_b) # 交集 print(set_a ^ set_b) # 對稱差集 print(set_a - set_b) # 差集 print(set_b - set_a) # 還是差集
並沒有"+"號,並集已經有"|"號可以獲得了。
集合刪除的3中方法:
set_a = set([1,2,3,4,5]) set_b = {1,3,5,7,9} c = set_a.pop() # 隨機刪除一個,返回值為刪除的元素 print(c,set_a) set_b.remove(3) # 指定刪除一個元素 print(set_b) set_b.discard(7) # 也是指定刪除一個元素 print(set_b) set_b.discard(2) # discard允許嘗試刪除不存在的元素,但是remove會報錯 #setb.discard(2) print(set_b)
文件的操作
open()打開文件。windows系統默認的是gbk編碼,如果不指定字符編碼,就會使用系統默認的字符編碼打開文件。比如這時python就會使用gbk編碼去讀utf-8文件,運行後會報錯或者讀到亂碼。
現在推薦我們的方法是全部文件都使用utf-8的編碼格式。open的時候就不要省略這個參數了,直接指定utf-8的字符編碼。
文件的基本操作:
file = open(‘test.txt‘,encoding=‘utf-8‘) # 打開文件,這裏指定了utf-8 data = file.read() # 讀取文件的全部內容 print(data) # 打印讀取的內容 file.close() # 關閉文件
讀取文件內容逐行打印:
file = open(‘test.txt‘,encoding=‘utf-8‘) # 打開文件,這裏指定了utf-8 for line in file: print(line.rstrip()) # 加了rstrip可以去掉每一行右邊的空格(包括換行符) file.close()
推薦上面的方法實現。這個方法是一次讀一行,讓後操作,然後再處理下一行。這是一個高效的方法。
如果是使用一次讀取整個文件到內存,然後再進行處理的實現方法(比如readlines()),在處理大文件的時候效率會低很多。雖然那也得文件足夠大(大到現在內存容量的級別幾個G)。
不過這個方法處理的時候數據就不是列表了,要獲取行號,只能在for循環開始的時候加一個計數器,然後每一次都自增1,這樣來記錄行號
file = open(‘test.txt‘,encoding=‘utf-8‘) # 打開文件,這裏指定了utf-8 count = 0 for line in file: count += 1 print(count,line.rstrip()) # 加了rstrip可以去掉每一行右邊的空格(包括換行符) file.close()
flush():強制刷新。默認寫文件的時候,是先寫入緩存,等緩存到一定數量後再一次全部寫入硬盤。如果對數據的實時性要求高的話,又不想關閉文件的話,就需要這個方法來手動強制執行一次寫如到硬盤的操作。
file = open(‘test.txt‘,‘a‘,encoding=‘utf-8‘) # 打開文件,追加模式 file.write("先回將我存入緩存\n") input("去打開文件看看文件有沒有更新") file.flush() print("現在再打開文件看看有沒有更新") input("文件關閉前也會寫入,我沒再試一次") file.write("再來一次,先回將我存入緩存\n") input("打開文件看看文件有沒有更新") print("現在再打開文件看看有沒有更新") file.close()
驗證了硬盤中的文件不是實時更新的。但是在flush()或者是close()之後,再去確認文件的時候都是最新的內容了。
文件的修改
文件的修改比較麻煩,沒有辦法做直接的修改。想要實現,只能重新全部寫一遍。
方法一:一次讀取文件的全部內容,然後修改後,再寫回去。不適合大文件
file = open(‘test.txt‘,encoding=‘utf-8‘) lines = file.readlines() # 讀取源文件 file.close() file_w = open(‘test2.txt‘,‘w‘,encoding=‘utf-8‘) # 重新打開一個文件,這裏方便比較,使用了新的文件名 #file_w = open(‘test.txt‘,‘w‘,encoding=‘utf-8‘) # 使用原來的文件名直接打開寫入就實現了文件的修改 for count,line_w in enumerate(lines): if count+1 == 3: line_w = "這是被替換的第三行\n" # 這裏修改替換掉第三行的內容,別忘了\n換行 file_w.write(line_w) # 將內容朱行寫入到新文件 file_w.close()
方法二:也可以采取讀一行,寫一行的方式。避免一次讀取過多的內容,更適合使用在大文件的場景。推薦:
file = open(‘test.txt‘,encoding=‘utf-8‘) # 打開源文件 file_w = open(‘test2.txt‘,‘w‘,encoding=‘utf-8‘) # 新建一個臨時的新文件 count = 0 # 這種情況只能用計數器來計算行數了 for line in file: count += 1 if count == 3: line = ‘這是被替換的第三行\n‘ # 這裏修改替換掉第三行的內容,別忘了\n換行 file_w.write(line) # 將內容朱行寫入到新文件 file.close() file_w.close()
並沒有完成文件的修改,到此只是將源文件修改後生成了一個新文件。還需要將源文件刪除,然後將新文件改名。對文件的操作(非文件內容),還需要調用os模塊,不過並不難。而且也不是這節課的重點,就略過了。
文件關閉的問題
文件用完後,可以用close()將文件關閉,釋放文件句柄。如果不關,問題也不大(不過肯定不是好習慣)。另外,程序運行完之後,所有打開的文件都會被關閉。
總之,打開文件,如果不操作了,就應該關閉它。
使用with來了打開文件,可以自動關閉文件(通過縮進,在代碼塊執行完畢後,自動關閉文件)。所以條件允許的情況下,盡量用with來打開文件。將上面2段用with來改寫一下
# 註意一下縮進,通過這個判斷文件是否操作完畢,從而自動關閉 with open(‘test.txt‘,encoding=‘utf-8‘) as file: lines = file.readlines() # 讀取源文件 with open(‘test.txt‘,‘w‘,encoding=‘utf-8‘) as file_w: for count,line_w in enumerate(lines): if count+1 == 3: line_w = "這是被替換的第三行\n" # 這裏修改替換掉第三行的內容,別忘了\n換行 file_w.write(line_w) # 將內容朱行寫入到新文件
# 可以同時對多個文件的上下文進行管理 # 另外,一行代碼不建議超過80個字符,這裏超了,所以用了\來分行 # 並且換行後可以對齊open,清晰的顯示了打開的文件數量 with open(‘test.txt‘,encoding=‘utf-8‘) as file, open(‘test2.txt‘,‘w‘,encoding=‘utf-8‘) as file_w: count = 0 # 這種情況只能用計數器來計算行數了 for line in file: count += 1 if count == 3: line = ‘這是被替換的第三行\n‘ # 這裏修改替換掉第三行的內容,別忘了\n換行 file_w.write(line) # 將內容朱行寫入到新文件
作業
購物車程序:
1、啟動程序後,輸入用戶名密碼後,如果是第一次登錄,讓用戶輸入工資,然後打印商品列表
2、允許用戶根據商品編號購買商品
3、用戶選擇商品後,檢測余額是否夠,夠就直接扣款,不夠就提醒
4、可隨時退出,退出時,打印已購買商品和余額
5、在用戶使用過程中, 關鍵輸出,如余額,商品已加入購物車等消息,需高亮顯示
6、用戶下一次登錄後,輸入用戶名密碼,直接回到上次的狀態,即上次消費的余額什麽的還是那些,再次登錄可繼續購買
7、允許查詢之前的消費記錄
上面是買家的模塊,另外再做一個賣家的模塊。賬號登錄後可以維護商品列表,新增、修改商品和價格。
Python自動化開發學習2-2