python3-基礎4

字符編碼python

字符編碼:  就是把人類的字符翻譯成計算機能識別的數字小程序

字符編碼表:  就是一張字符與數字對應關係表   ascii   gbk   utf-8   unicode 測試

     unicode  ------>  encode(utf-8) ------> bytes  轉換     (內存中的編碼轉換成硬盤的編碼,編碼)編碼

      bytes ------> decode('utf-8') ------> unicode  轉換     (解碼)spa

原則:  字符以什麼格式編譯的,就要以什麼格式解碼操作系統

  python3 中的字符串分爲兩種翻譯

     x='lalala' 存成 unicode
     y=x.encode('utf-8') 存成 bytescode

 

 

文件處理blog

打開文件內存

f = open('a.txt' , 'r' , encoding = 'utf-8')       #windos下用 GBK編碼,Linux下用utf-8編碼 

#在r模式下,若是文件不存在,不會建立新文件

res = f.read()    #讀取a.txr,光標移動到文件末尾

print(res)

print('第二次' , f.read())     # 光標已經移動到末尾,因此沒法再讀出文件

print(f.readline() , end='')   #逐行讀取,以空格結尾

print(f.readlines())  #讀取文件全部行,組成一個列表

f.close()   #  切記關閉已打開的文件

 

傻瓜式操做  打開--關閉文件   用  with ---  as

with   open('a.txt' , 'r' , encoding = 'utf-8')  as f:      #  用 with  open 打開文件,將結果傳給 f, 也能夠打開多個文件   open b as f1 , open c as f2 :

    pass

 

寫模式

f=open('a.txt' , 'w' , encoding = 'utf-8' )

f.write('11111111\n')

f.write('2222\n')

f.write('3333\n444444\n')

f.writelines(['a\n' , 'b\n' ,'c\n'])    #

f.close()

 

 1 #將文件整個讀取到內存後,再執行後續操做
 2 with open('old.txt', 'r', encoding='utf-8') as read_f :
 3     msg = read_f.read()
 4     msg = msg.replace('alex', lalala')   #內容替換  Alex 換成  lalala
 5     print(msg)
 6     
 7 with open('old.txt', 'r', encoding='utf-8') as read_f \                     
 8 open('.old.txt.swap', 'w', encoding='utf-8') as write_f :               
 9     msg = read_f.read()
10     msg = msg.replace('alex', lalala')         #內容替換 Alex 換成 lalala
11     print(msg)    
12     write_f.write(msg) 
13 
14 os.remove('old.txt')
15 os.rename('.old.txt.swap', 'old.txt')
16                       
17 #若是文件過大,須要逐行讀取
18 import os
19 with open('old.txt', 'r', encoding='utf-8') as read_f \                     
20 open('.old.txt.swap', 'w', encoding='utf-8') as write_f :
21     for line in read_f:   #逐行讀取
22         print(line)
23         if 'lalala' in line:   #判斷是否有 lalala
24              line = line.replace('lalala', 'alex') #將 lalala 替換爲  Alex  
25              write_f.write(line)   #將修改後的內行寫入到新的文件裏去
26         else:
27              write_f.write(line)   #沒有修改的行,也要寫入到新的文件裏去  
28 os.remove('old.txt')
29 os.rename('.old.txt.swap', 'old.txt')                
30       
 

 幾種模式

# r 文本模式的 讀 (不能寫,只能讀),若文件不存在,不會建立新文件

f = open('a.txt', 'r', encoding = 'utf-8')

print(f.read())

f.clos()  #向操做系統請求關閉打開的文件,f爲一個變量,

 

# w 文本模式的 寫 (不能讀,只能寫), 若文件不存在,則建立,若文件存在,則清空

f = open('a.txt', 'w', encoding = 'utf-8')

print(f.writable())     #判斷是否爲寫模式    返回結果 True  或 False

print(f.write())  

f.write('哈哈哈哈\n')

f.writelines(['1111\n','222\n'])

 

# a 文本模式的追加寫入(不能讀,只能寫)  , 文件存在,則光標跳到文件末尾,若文件不存在,則建立

 f = open('a.txt','a',encoding='utf-8')

 print(f.tell())   #能夠返回光標所在位置

 f.write('3333\n')
 f.write('44444\n')

 

# r+,w+,a+     可讀可寫模式

 

#rb 模式 直接從硬盤中讀取 bytes

 f = open('a.txt','rb')

 print(f.read())    #出現硬盤保存的文件,人類沒法識別

 

# wb模式 , 若文件存在,會清空
# f=open('a.txt','wb')
# f.write('你好啊'.encode('utf-8'))  #若是不加encode 類型, 會報錯

 

 # ab模式  同 wb模式

 

# with 模式     --  自動關閉打開的文件

 with open('file.txt','w',encoding='utf-8') as f:
 f.write('1111\n')

 

拷貝不一樣格式的文件

 f=open('test.jpg','rb')
 print(f.read())

 with open('test.jpg','rb') as read_f,open('test1.jpg','wb') as write_f:
     # write_f.write(read_f.read())
     for line in read_f:
     write_f.write(line)

 

 1 #拷貝小程序,名稱爲 copy.py    -----  python3 copy.py source.file target.file
 2 import sys
 3 #print(sys.argv())  #查看有什麼參數
 4 
 5 #python3 copy.py source.file target.file    #須要三個參數:文件自己、源文件、目標文件
 6 if len(sys.argv) < 3:   #若參數小於3  則退出
 7     print('Usage:python3 copy.py source.file target.file')
 8     sys.exit()
 9 
10 
11 #此方法可能致使在不一樣的平臺,文件路徑中有不一樣的符號,致使路徑出錯
12 # with open(sys.argv[1], 'rb') as read_f, open(sys.argv[2] , 'wb') as write_f :  
13 #     for lin in read_f:
14 #         write_f.write(line)
15 
16 #r'C:\Users\Administrator\test.jpg'   #加r 表示原生字符串,保障路徑不會有問題
17 
18 #用下面的方法,保障全部平臺可用
19 with open(r'%s' %sys.argv[1],'rb') as read_f,\
20         open(r'%s' %sys.argv[2],'wb') as write_f:
21 
22     for line in read_f:
23         write_f.write(line)

 

文件其餘操做

f=open('a.txt','r',encoding='utf-8')   #讀取文本
print(f.read(3))  #能夠讀取三個字符,中文算一個,英文也算一個

 

 f=open('a.txt','rb')   #以字節方式讀取
 print(f.read(3).decode('utf-8'))  #讀了三個字節,一箇中文佔用3個字節,decode解碼後顯示一個漢字

 print(f.read(6).decode('utf-8'))   #讀取兩個漢字

 

一: read(3):

  1. 文件打開方式爲文本模式時,表明讀取3個字符

  2. 文件打開方式爲b模式時,表明讀取3個字節

二: 其他的文件內光標移動都是以字節爲單位如seek,tell,truncate

注意:

  1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的

  2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果

 

 f=open('a.txt','rb')     #字節模式下
 print(f.read(3))    #讀取三個字節(一箇中文)
 print(f.tell())    #查看光標的位置  
 f.seek(3)     #以文件開頭做爲參照物,至關於 f.seek(3, 0 ),光標移動到第三個字節的位置

 f.seek(3,1)       #以文件當前的光標位置做爲參照物,光標移動到當前光標日後數3個字節的位置

 f.seek(3,2)       #以文件結尾做爲參照物,光標移動到倒數第三個字節的位置

 print(f.tell())    #查看光標的位置
 print(f.read().decode('utf-8'))   #解碼,顯示文本信息

 

 1 # python3 tail.py -f access.log    
 2 #檢測某個文件的更新,好比 access.log
 3 
 4 import time
 5 import sys    #調用argw,是個列表,裏面的參數爲   腳本名稱 , -f參數 , 文件名稱 
 6 
 7 with open(r'%s' % sys.argv[2], 'rb') as f:    #打開文件,該文件必須存在,下標爲2的參數爲文件名稱
 8     f.seek(0, 2)  #光標移動到文件最末尾
 9 
10     while True:
11         line = f.readline()   #整行讀取
12         if line:
13             print(line.decode('utf-8'),end='')   ##將文本解碼,以空格爲結尾
14         else:
15             time.sleep(0.2)   #等待0.2秒再次執行
16             
17             
18 #自動添加文件內容            
19 # with open('acess.log','a') as f:
20 #     f.write('1111\n')            
21              

 

截斷文件,屬於寫模式

 with open('a.txt','r+',encoding='utf-8') as f: f.truncate(2)    #以文件開頭爲參照物,截取前兩個字節,以後的文件清空,若是是中文,必須截取3的倍數的字符,不然會亂碼

相關文章
相關標籤/搜索