python 04 文件操做、編碼轉碼

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()
View Code

 二、其餘操做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)              #從文件開頭開始截斷指定個數字符,不寫內容會清空文件
View Code

三、文件修改 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()
View Code

四、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
View Code

 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類型
View Code

不管是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)         #你好
View Code

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類型數據
View Code

 在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類型
View Code

 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('請輸入正確的編號!')
View Code

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!!")
View Code
相關文章
相關標籤/搜索