Python基礎學習04python
文件操做git
字符編碼字符轉碼shell
簡單三級菜單json
簡單購物車緩存
1、文件操做
一、文件打開操做網絡
1 f = open("text.txt",encoding = "utf-8") #文件句柄 2 data = f.read() #讀文件內容 3 data_2 = f.read() 4 print( data ) #正常輸出 5 print("aaaaaaaaaaa") #輸出:aaaaaaaaaaa 6 print(data_2) #無輸出(文件讀完以後光標移動到最後,在次讀不會有新的內容) 7 f.close() #關閉文件 8 #此爲非規範書寫,沒有書寫讀寫模式,默認爲讀模式 9 f = open("text.txt","r",encoding = "utf-8") #標準書寫(只能讀文件) 10 f.close() 11 12 f = open("text_1.txt","w",encoding = "utf-8") #建立一個新文件,並以寫模式打開,若以前存在同名的文件則會覆蓋 13 f.write("你不面對現實\n") #只能對文件進行寫操做,不能讀取 14 f.write("現實就會面對你") 15 f.close() 16 '''文檔內容: 17 你不面對現實 18 現實就會面對你 19 ''' 20 21 f = open("text_1.txt","a",encoding = "utf-8") #以寫模式打開一個文件,並在文件末尾追加新內容 22 f.write("\n勿以惡小而爲之\n") #只能對文件進行寫操做,不能讀取 23 f.write("勿以善小而不爲") 24 f.close() 25 '''文檔內容: 26 你不面對現實 27 現實就會面對你 28 勿以惡小而爲之 29 勿以善小而不爲 30 ''' 31 # r:只讀模式(默認)。 32 # w:只寫模式。(不可讀;不存在則建立;存在則刪除內容;) 33 # a:追加模式。(不可讀;不存在則建立;存在則只追加內容;) 34 35 #預先讀取文件內容到內存中(少用) 36 f = open("text.txt","r",encoding = "utf-8") 37 for i in range(3): 38 print(f.readline()) #逐行讀取,讀取前3行 39 for line in f.readlines(): #預先讀取文件內容並把文件中全部內容以列表的形式存到內存中(不適用於大文件) 40 print(line.strip()) #逐行打印所有文件內容(strip()去掉換行空格) 41 42 for index,line in enumerate(f.readlines()): 43 if index == 5 : #當文件讀取到第5行時 44 print('----------') #用"----------"來替換第6行的內容 45 continue #繼續讀取 46 print(line.strip()) #打印讀取內容 47 48 #逐行讀取文件內容到內存中(經常使用) 49 count = 0 50 for line in f: 51 if count == 5: 52 print('----------') 53 count += 1 54 continue 55 print(line.strip()) 56 count += 1 57 f.close() 58 59 60 61 # "+" 表示能夠同時讀寫某個文件 62 # r+,可讀寫文件。(可讀;可寫(追加寫模式)) 63 # w+,寫讀(先新建文件,而後寫入新內容,以後讀本身寫的內容) 64 # a+,追加讀寫 65 66 f = open("text.txt","r+",encoding = "utf-8") #經常使用 67 f.close() 68 69 f = open("text_2.txt","w+",encoding = "utf-8") #不經常使用 70 f.write("________________\n") 71 f.write("++++++++++++++++\n") 72 f.write("================\n") 73 f.seek(0) 74 print(f.readline()) #輸出:________________ 75 print(f.readline()) #輸出:++++++++++++++++ 76 print(f.readline()) #輸出:================ 77 f.close() 78 79 #"b"表示處理二進制文件(bytes類型) 80 # rb 81 # wb 82 # ab 83 #網絡傳輸會用到,網絡傳輸只能用二進制模式 84 f = open("text.txt","rb") #二進制讀 85 print(f.readline()) #輸出:# b'When you are old\r\n' 86 f.close() 87 88 f = open("text_2.txt","wb") #二進制寫 89 f.write("當你老了".encode()) 90 f.close()
二、其餘操做app
1 f = open("text_1.txt","r",encoding = "utf-8") 2 print(f.tell()) #文件句柄指針指向的位置 輸出:0 3 print(f.readline()) #讀1行內容 4 print(f.tell()) #輸出:20 5 6 print(f.readline()) #在讀一行內容 輸出:現實就會面對你 7 f.seek(20) #將文件句柄指針指向的位置移動到指定位置 8 print(f.readline()) #輸出:現實就會面對你 9 10 f.flush() #刷新(寫完數據後數據是存在內存緩存中的,flush是把緩存中的數據存到硬盤中) 11 f.close() 12 #實現進度條 13 import sys,time 14 for i in range(50): 15 sys.stdout.write("#") 16 sys.stdout.flush() 17 time.sleep(0.1) 18 19 f = open("text_1.txt","a",encoding = "utf-8") 20 f.truncate(10) #從文件開頭開始截斷指定個數字符,不寫內容會清空文件
三、文件修改 iphone
1 #文件修改:打開一個文件,修改後存到一個新的文件 2 f = open("text.txt","r",encoding = "utf-8") #以讀模式打開源文件 3 f_new = open("text_new.txt","w",encoding = "utf-8") #以寫模式打開新文件 4 for line in f: #逐行讀取 5 if "慢慢讀着" in line: #找到想要修改的位置 6 line = line.replace("慢慢讀着","manmanduzhe") #修改字符串 7 f_new.write(line) #將內容寫入新文件 8 f.close() 9 f_new.close() 10 11 12 #實現簡單的shell sed 替換功能 13 import sys 14 f = open("text.txt","r",encoding = "utf-8") #以讀模式打開源文件 15 f_new = open("text_new.txt","w",encoding = "utf-8") #以寫模式打開新文件 16 find_str = sys.argv[1] 17 replace_str = sys.argv[2] 18 for line in f: #逐行讀取 19 if find_str in line: #找到想要修改的位置 20 line = line.replace(find_str,replace_str) #修改字符串 21 f_new.write(line) #將內容寫入新文件 22 f.close() 23 f_new.close()
四、with操做ide
1 #f = open("text.txt","r",encoding = "utf-8") #以讀模式打開源文件 2 with open("text.txt","r",encoding = "utf-8") as f: #與上面功能相同 3 print(f.readline()) 4 #爲了不打開文件後忘記關閉 5 6 #在Python 2.7 後,with又支持同時對多個文件的管理,即: 7 with open('log1') as obj1, open('log2') as obj2: 8 pass 9 #python開發規範:一行代碼儘可能不要超過80個字符(因此上面格式能夠寫成下面這樣) 10 with open("text.txt","r",encoding = "utf-8") as f,\ 11 open("text_2.txt","r",encoding = "utf-8") as f2: 12 pass
2、字符編碼字符轉碼
1、字符編碼學習
一、ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)
是基於字母的一套電腦編碼系統,主要用於顯示現代英語,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256-1種不一樣狀態,每種狀態就惟一對應一個字符,好比A--->00010001,而英文只有26個字符,算上一些特殊字符和數字,128個狀態也夠,這樣計算機就能夠用127個不一樣字節來存儲英語的文字了。這就是ASCII編碼。
擴展ANSI編碼
最開始,一個字節有八位,可是最高位沒用上,默認爲0;後來爲了計算機也能夠表示拉丁文,就將最後一位也用上了,從128到255的字符集對應拉丁文。因此,ASCII碼主要用於顯示現代英語和其餘西歐語言,最多隻能表示 255 個符號。
二、GB2312(1980年)
計算機來到中國後,計算機不認識中文,固然也無法顯示中文;並且一個字節全部狀態都被佔滿了,因而中國人重寫一張表,直接將擴展的第八位對應拉丁文所有刪掉,規定一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一塊兒時,就表示一個漢字,前面的一個字節(他稱之爲高字節)從0xA1用到0xF7,後面一個字節(低字節)從0xA1到0xFE,這樣咱們就能夠組合大約7000多個簡體漢字了(一共收錄了7445個字符);這種漢字方案叫作 「GB2312」。GB2312 是對 ASCII 的中文擴展。
三、GBK 和 GB18030編碼
漢字太多了,GB2312不夠用,因而規定:只要第一個字節是大於127就固定表示這是一個漢字的開始,無論後面跟的是否是擴展字符集裏的內容。結果擴展以後的編碼方案被稱爲 GBK 標準,GBK 包括了 GB2312 的全部內容,同時又增長了近20000個新的漢字(包括繁體字)和符號。1995年的漢字擴展規範GBK1.0收錄了21886個符號,它分爲漢字區和圖形符號區。漢字區包括21003個字符。
2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。
從ASCII、GB23十二、GBK 到GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中老是有相同的編碼,後面的標準支持更多的字符。
如今的PC平臺必須支持GB18030,對嵌入式產品暫不做要求。因此手機、MP3通常只支持GB2312。
四、UNICODE編碼
不少其它國家都搞出本身的編碼標準,彼此間卻相互不支持。這就帶來了不少問題。因而,國際標誰化組織爲了統一編碼,提出了標準編碼準則:UNICODE 。
Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,規定由 16 位來表示一個字符(2個字節),即:2 **16 = 65536,這足以覆蓋世界上全部符號(包括甲骨文)
五、UTF-8
unicode能夠解決全部編碼,爲何還要有一個utf-8的編碼呢?
對於英文世界的人們來說,一個字節徹底夠了,好比要存儲A,原本00010001就能夠了,如今unicode得用兩個字節:00000000 00010001才行,浪費太嚴重,基於此,科學家們提出了:utf-8。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...這樣好處是,雖然在咱們內存中的數據都是unicode,但當數據要保存到磁盤或者用於網絡傳輸時,直接使用unicode就遠不如utf-8省空間,這也是爲何utf-8是推薦編碼方式。
Unicode與utf8的關係:
Unicode是內存編碼表示方案(是規範),而UTF是如何保存和傳輸Unicode的方案(是實現)這也是UTF與Unicode的區別。
2、py2字符編碼字符轉碼
在py2中,有兩種字符串類型:str類型和unicode類型;str類型存字節數據,unicode存的是unicode數據
在python2默認編碼是ASCII
1 #coding:utf-8 #在python2中默認編碼是ASCII,必須聲明編碼,不然不能解析中文,會報以下錯誤信息 2 # SyntaxError: Non-ASCII character '\xe4' in file zz.py on line 4, but no encoding declared; 3 4 s1='你好' #在py2中定義字符串(默認類型) 5 print type(s1) # <type 'str'> #類型爲str類型 6 print repr(s1) #'\xe4\xbd\xa0\xe5\xa5\xbd' #存儲的數據爲字節數據 7 s2=u'你好' #用unicode類型定義字符串 8 print type(s2) # <type 'unicode'> #類型爲unicode類型 9 print repr(s2) # u'\u4f60\u597d' #存儲的數據unicode數據 10 11 b=s2.encode('utf-8') #將unicode數據以utf-8進行編碼 12 print b #浣犲ソ #輸出亂碼 13 print type(b) #<type 'str'> #類型爲str類型 14 print repr(b) #'\xe4\xbd\xa0\xe5\xa5\xbd' 15 16 u=s1.decode('utf-8') #將utf-8編碼的字節用utf-8的規則解碼 17 print u # 你好 18 print type(u) # <type 'unicode'> #解碼後數據類型爲unicode類型 19 print repr(u) # u'\u4f60\u597d' #存儲的數據unicode數據 20 21 u2=s1.decode('gbk') #將utf-8編碼的字節用gbk的規則解碼 22 print u2 #浣犲ソ #輸出亂碼 23 print type(u2) # <type 'unicode'> #解碼後數據類型依舊爲unicode類型
不管是utf8仍是gbk都只是一種編碼規則,一種把unicode數據編碼成字節數據的規則,因此utf8編碼的字節必定要用utf8的規則解碼,不然就會出現亂碼或者報錯的狀況
在Python2中運行帶有中文的程序會先聲明編碼,通常爲UTF-8或GBK,定義字符串後,字符串的數據格式爲bytes,若是須要打印輸出,需將bytes類型decode爲事先聲明的編碼
轉換編碼時,需先decode(「當前編碼」),解碼成Unicode,後將Unicode編碼encode(「目標編碼」)。此時轉換完成
1 #coding:utf-8 2 3 import sys 4 print(sys.getdefaultencoding()) #ascii 5 6 msg = "你好" 7 msg_gb2312 = msg.decode("utf-8").encode("gb2312") #將utf-8編碼轉換成gb2312編碼 8 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk") #將gb2312編碼轉換成gbk編碼 9 10 print(msg) #浣犲ソ (py2中str類型存字節數據) 11 print(msg.decode("utf-8")) #你好 將msg的字節數據以utf-8解碼 12 print(msg_gb2312) #你好 13 print(gb2312_to_gbk) #你好
3、py3字符編碼字符轉碼
py3也有兩種數據類型:str和bytes; str類型存unicode數據,bytse類型存bytes數據,與py2比只是換了一下名字而已。
在python3默認編碼是unicode
1 #py3中默認編碼是unicode類型,不用聲明編碼,也能解析中文 2 import json 3 s1='你好' #在py3中定義字符串(默認類型) 4 print(type(s1)) #<class 'str'> #類型爲str類型 5 print(json.dumps(s1)) # "\u4f60\u597d" #存儲的數據爲unicode類型數據 6 7 #s2 = b"你好" #py3中不能把中文直接定義成字節類型,會報錯:SyntaxError: bytes can only contain ASCII literal characters. 8 #字節只能包含ASCII文字字符 9 10 b=s1.encode('utf-8') #將字符串以utf-8格式編碼 11 print(type(b)) # <class 'bytes'> #編碼後數據類型爲bytes類型 12 print(b) # b'\xe4\xbd\xa0\xe5\xa5\xbd' #以bytes格式輸出字符串 13 14 u=b.decode('utf-8') #將bytes類型數據以utf-8格式解碼 15 print(type(u)) #<class 'str'> #解碼後數據類型爲str類型 16 print(u) #你好 #打印輸出 17 print(json.dumps(u)) #"\u4f60\u597d" #存儲的數據爲unicode類型數據
在Python3中默認就是unicode,不用再decode
1 import sys 2 print(sys.getdefaultencoding()) #utf-8 3 4 msg = "你好" 5 6 msg_gb2312 = msg.encode("gb2312") #默認就是unicode,不用再decode 7 gb2312_to_unicode = msg_gb2312.decode("gb2312") #將gb2312編碼的bytes類型數據 8 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") 9 #將gb2312編碼的字符串,先解碼後編碼成utf-8類型到bytes數據 10 print(msg) # 你好 #默認就是unicode,不用再decode直接顯示 11 print(msg_gb2312) #b'\xc4\xe3\xba\xc3' #encode後變成gb2312編碼的bytes類型 12 print(gb2312_to_unicode) #你好 #將將gb2312編碼的bytes類型數據解碼 13 print(gb2312_to_utf8) #b'\xe4\xbd\xa0\xe5\xa5\xbd' #utf-8編碼後的bytes類型
3、簡單三級菜單
1 data = { 2 '山東':{ 3 '青島' :['四方','黃島','嶗山','李滄','城陽'], 4 '濟南' : ['歷城','槐蔭','高新','長青','章丘'], 5 '煙臺' : ['龍口','萊山','牟平','蓬萊','招遠'] 6 }, 7 '江蘇':{ 8 '蘇州' : ['滄浪','相城','平江','吳中','崑山'], 9 '南京' : ['白下','秦淮','浦口','棲霞','江寧'], 10 '無錫' : ['崇安','南長','北塘','錫山','江陰'] 11 }, 12 '河北': { 13 '石家莊': ['鹿泉', '藁城', '元氏'], 14 '邯鄲': ['永年', '涉縣', '磁縣'], 15 } 16 } 17 run_data = True 18 while run_data: 19 for i in data: 20 print(i) 21 choice = input('選擇進入的菜單,按q退出:') 22 if choice in data: 23 while run_data: 24 for i1 in data[choice]: 25 print(i1) 26 print('按q退出,按b返回上一級菜單!') 27 choice1=input('選擇進入的菜單:') 28 if choice1 in data[choice]: 29 while run_data: 30 for i2 in data[choice][choice1]: 31 print(i2) 32 choice3 = input('按q退出,按b返回上一級菜單!:') 33 if choice3 == 'b': 34 break 35 elif choice3 == 'q': 36 run_data= False 37 else: 38 print('這是最後一級菜單!') 39 elif choice1 == 'b': 40 break 41 elif choice1 == 'q': 42 run_data=False 43 else: 44 print('請輸入正確的編號!') 45 elif choice == 'q': 46 run_data=False 47 else: 48 print('請輸入正確的編號!')
4、簡單購物車
1 product_list = [ 2 ('iphone',5000), 3 ('computer',6000), 4 ('watch',1500), 5 ('bike',100), 6 ('book',50), 7 ('fruit',20) 8 ] 9 shopping_list = [] 10 sallary = input("Please Input Your Sallary:") 11 if sallary.isdigit(): 12 sallary = int(sallary) 13 while True: 14 #for item in product_list: 15 # print(product_list.index(item),item) 16 for index,item in enumerate(product_list): 17 print(index,item) 18 print('input q to finish your shopping') 19 user_choice = input("please input your goods number:") 20 if user_choice.isdigit(): 21 user_choice = int(user_choice) 22 if user_choice<len(product_list) and user_choice>=0: 23 p_item = product_list[user_choice] 24 if p_item[1] < sallary: 25 shopping_list.append(p_item) 26 sallary -=p_item[1] 27 print("Add %s into shopping cart , your current balence is %s"%(p_item,sallary)) 28 else: 29 print("you dont have so much money! ") 30 else: 31 print("there is no goods with your number!!") 32 elif user_choice == 'q': 33 print('-----your shopping list-----') 34 for p in shopping_list: 35 print(p) 36 print("your current balance is :",sallary) 37 exit() 38 else: 39 print("please input right number!!") 40 #break 41 else: 42 print("Please input right sallary!!")