1.編碼的進階html
字符串在Python內部的表示是unicode編碼,所以,在作編碼轉換時,一般須要以unicode做爲中間編碼。
即先將其餘編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另外一種編碼。 decode的做用是將其餘編碼的字符串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串str1轉換成unicode編碼。 encode的做用是將unicode編碼轉換成其餘編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串str2轉換成gb2312編碼。 所以,轉碼的時候必定要先搞明白,字符串str是什麼編碼,而後decode成unicode,而後再encode成其餘編碼
other:
1.在網絡傳輸過程當中,不能使用Unicode編碼去編譯數據,可是str又是unicode編碼的,只能在傳輸或者存儲過程當中將unicode裝轉化成非unicode,因此須要(3)
2.windows: 編碼:gbk.
linux,mac: 編碼是utf-8.
3.bytes數據類型,與str幾乎如出一轍.(二進制的形式)
4.bytes是一種基本數據類型
2.文件操做(文件光標是重點,可能會有坑)python
文件能夠從多個維度進行管理:文件重命名,獲取文件屬性,判斷文件是否存在,備份文件,讀寫文件,打包解壓等等。
在python讀取文件只須要經過內置函數open來打開文件便可,open函數接受文件名稱和打開模式做爲參數,返回一個文件對象,操做完文件以後,通過文件對象的close方法關閉便可
info = open('456',encoding='utf-8',mode='r') #要加上編碼方式,讀取到info文件對象裏面
print(info.read()) #經過info文件對象的read方法讀取文件的全部內容,並打印
info.close() #關閉這個文件對象
open函數默認以"r"的方式打開,也能夠知道那個文件的打開模式
r:默認以讀的方式打開,若是文件不存在,拋出FileFoundError異常
w:以寫模式打開,若是文件非空,則已有的內容將會被覆蓋,若是文件不存在,將建立文件並寫入
a:在文件末尾追加數據的方式寫入,沒有文件則建立文件寫入
x:建立一個新文件,若是文件存在,則拋出FileExisError異常
r+:可讀寫文件。可讀;可寫;可追加 ,先讀後寫
w+:寫讀
U:表示在讀取時,能夠將\r\n自動轉換成 \n (與 r 或 r+ 模式同使用, rU或者r+U)
b:表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註,通常都是非文字的文件,按字節讀取)
open函數的其餘方法
info.close() #關閉文件
info.flush() #刷新緩衝區,將緩衝區的數據當即寫入到文件
info.isatty() #判斷文件是否鏈接到終端設備,返回bool值
info.read(10) #讀取文件前10個字符,從文件中讀取指定的字符數,默認讀取所有,rb模式下是字節
info.readline(3)) #讀取前3個字符,默認每次最多讀取一行數據,每行的最後包含換行符'\n'
info.readlines() #將文件存入到列表中,列表中的麼一行就是文件中的每一行
info.readable #判斷文件是否可讀,返回布爾值
info.seek(3) #移動文件讀取的指針,若是文件中包含中文,移動指針必須是3的倍數,否則會報錯,由於一箇中文字符等於3個字節
seek(0,0) 文件開頭 seek(0,1) 當前位置 seek(0,2) 文件最後
info.seekable #判斷文件指針是否可用,返回布爾值
info.tell() #獲取指針位置
info.truncate() #截斷,把指針後面的內容刪除,並寫入文件,必須在可寫模式下操做,讀取的是字節
f = open('text.txt','r+',encoding='utf-8')
f.seek(9) #把指針移動到第9個字節後面(即第3箇中文後面)
f.truncate() #把第3箇中文後面全部的字符刪除,並寫入文件
f.close()
info.writable() #判斷文件是否可寫,返回布爾值
info.write() #把字符串寫入文件,並返回字符數
info.writelines() #寫一個字符串列表到文件
在計算機中,每打開一個文件就須要佔用一個文件句柄,而一個進程擁有的文件句柄是有限的,而且文件句柄也會佔用操做系統的資源,因此,在打開文件之後要及時關閉文件,避免文件句柄泄露
1.可使用finally關閉文件句柄,而且在什麼狀況是都會關閉(可是不提倡,由於python提倡優美,簡潔)
try:
info = open("test.txt",encoding='utf-8',mode='r')
peint(info)
finally:
info.close()
2.使用上下文管理器(會打開文件,而後自動關閉,不用close函數)
with open('data.txt',encoding='utf-8',mode='r') as info,open('data.txt',encoding='utf-8',mode='w')as info2:
print(info.read())
如何讀取大文件?(for循環過程當中,每使用一行,便在內存生成一行,用完即回收地址)
使用上下文管理器和for循環,由於for循環不只能夠遍歷如字符串,列表,元祖等可迭代序列,還可使用可迭代協議來便利迭代對象,文件對象就實現了可迭代協議
with open('data',encoding='utf-8',mode=='r') as info:
for line in info:
print(line.upper())
使用print語句也能夠將數據寫入到文件
with open ("456","a+",encoding="utf-8") as info:
print(1,2,'hello,world',sep='\n',file=info) #經過追加讀寫方式打開文件,並把標準輸出(file)寫入到文件
文件的修改:(world,wps等大公司的文件修改都是如此)
#1,以讀的模式打開原文件.
#2,以寫的模式建立一個新文件.
import os
with open('abc.txt',encoding='utf-8') as f1,\
open('abc.txt.bak',encoding='utf-8',mode='w') as f2:
#3,將原文件內容讀取出來,按照要求改爲新內容,寫入新文件.
for old_line in f1:
new_line = old_line.replace('kobe','god')
f2.write(new_line)
#4,刪除原文件.
os.remove('abc')
#5,將新文件重命名成原文件.
os.rename('abc.txt.bak','abc.txt')linux
各類模式讀寫關係windows
3.深淺copy網絡
深淺copy的主要區別在因而否包含可變或者不可變的數據類型
Python中,對象的賦值,拷貝(深/淺拷貝)之間是有差別的,若是使用的時候不注意,就可能產生意外的結果,其實這個是因爲共享內存致使的結果 拷貝:原則上就是把數據分離出來,複製其數據,並之後修改互不影響。
1.首先先看一個賦值的狀況:使用=進行賦值的時候,數據徹底共享
=賦值是在內存中的同一個內存地址被分別貼上了不一樣的標籤,
若是這個內存地址指向的數據是可變的類型元素,那麼使用其中任意一個標籤來修改這個數據,另一個也會變化
若是這個內存地址指向的數據是不可變的類型,那麼適用其中任意一個標籤來修改這個數據,都會在內存中新建立一個數據,而且另外一個不會變
2.淺拷貝:
如圖,這就是淺拷貝的原理,其中l1和l2的id不一樣。l2拷貝l1的時候只拷貝了他的第一層,也就是在其餘內存中指向了l1的第一層數據,可是l2沒法拷貝l1的第二層數據,也就是列表中的列表,因此他就只能指向l1中的第二層數據函數
由此,當修改l1中第二層數據的時候,淺拷貝l1的l2中的第二層數據也隨之發生改變,可是指向的第二層的內存地址仍是同樣編碼
淺拷貝以後,若是改變了可變的數據類型以後,兩者可變類型數據的id不會發生變化,若是改變了不可變數據類型的話,兩者改變了的不可變的數據的id纔不同
3.深拷貝:spa
不管是同一個代碼塊,不一樣代碼塊下:不只建立一個新外殼(列表),外殼裏面的可變的數據類型也建立一份新的,可是不可變的數據類型共用一個.操作系統
import copy l1 = [1, 2, 3, [11, 22, 33]] # l2 = copy.copy(l1) 淺拷貝 l2 = copy.deepcopy(l1)
能進行深淺copy的數據類型 :dict list set3d