檔案處理的b模式,b模式 開啟的是二進位制
f=open('test11.py','rb',encoding='utf-8') #b的方式不能指定編碼f=open('test11.py','rb') #b的方式不能指定編碼
data=f.read()
#'字串'---------encode---------》bytes
#bytes---------decode---------》'字串'
print(data)
print(data.decode('utf-8'))
f.close()
f=open('test22.py','wb') #b的方式不能指定編碼f.write(bytes('1111\n',encoding='utf-8')) #方法一
f.write('楊件'.encode('utf-8')) #方法二
檔案操作的其他方法
檔案r模式的話是根據系統的編碼
f=open('a.txt','r+',encoding='utf-8')data=f.read()
print(f.encoding) #utf-8
f.write('你好') #乙個檔案只能有一種格式
f=open('a.txt','r',encoding='utf-8',newline='') #讀取檔案中真正的換行符號print(f.closed)
print(f.encoding) #列印字元編碼
f.flush() #重新整理 儲存資料
print(f.readlines())
f=open('a.txt','r',encoding='utf-8',newline='') #讀取檔案中真正的換行符號print(f.closed)
print(f.encoding) #列印字元編碼
print(f.tell()) #0 檔案當前位置
f.readline()
print(f.tell()) #6 檔案當前位置
f.flush() #講檔案內容從記憶體刷到硬碟f.closed #檔案如果關閉則返回true
f.encoding #檢視使用open開啟檔案的編碼
f.tell() #檢視檔案處理當前的游標位置
f.seek(3) #從開頭開始算,將游標移動到第三個位元組
f.truncate(10) #從開頭開始算,將檔案只保留從0-10個位元組的內容,檔案必須以寫方式開啟,但是w和w+除外
迭代器
迭代更新換代
迭代器協議:
for迴圈的本質:迴圈所有物件,全都使用迭代器協議
只要有__iter__方法 就可以把他們變成可迭代物件,然後for迴圈呼叫物件的__next__()方法去取值,而且for迴圈會捕捉stopiteration異常,以終止迭代
next() #是內建函式
next() ---> #呼叫迭代器的__next__()方法
迭代器就是可迭代物件,他們是一回事。只要遵循迭代器協議,生成的資料型別就是可迭代物件
可迭代物件:
只要遵循迭代器協議,生成的資料型別就是可迭代物件
iter_l=l.__iter__() #遵循迭代器協議,生成可迭代物件print(iter_l.__next__())
print(iter_l.__next__())
for i in s:print(i)
iter_s=s.__iter__()
print(iter_s)
print(iter_s.__next__())
print(iter_s.__next__())
print(iter_s.__next__())
print(iter_s.__next__())
dic=iter_d=dic.__iter__()
print(iter_d.__next__()) #a
l=['die','erzi','sunzi','chongsunzi']iter_l=l.__iter__()
print(iter_l)
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(next(iter_l)) #next()---->iter_l.__next__()
生成器
什麼是生成器?
可以理解為一種資料型別。這種資料型別自動的實現了迭代器協議(其他的資料型別需要呼叫自己的__iter__方法),所以生成器是可迭代物件
python提供了2中的不同的方式生成器
1.生成器函式:常規函式定義,但是,使用yield語句而不是使用return語句返回結果。yield語句返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方繼續執行
def test():yield 1
yield 2
yield 3
g=test()
print('來自函式',g) #來自函式 print(g.__next__()) #1
print(g.__next__()) #2
print(next(g)) #3
2.生成器表示式: 類似於列表推導。但是,生成器返回按需產生結果的乙個物件。而不是一次構建乙個結果列表
#列表解析egg_list=
for i in range(5):
print(egg_list) #['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4']
l=['雞蛋%s' %i for i in range(5)]
print(l) #['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4']
l1=['雞蛋%s' %i for i in range(5) if i > 3 ]
print(l1) #['雞蛋4']
# l1=['雞蛋%s' %i for i in range(5) if i > 3 else i] #沒有四元表示式
l2=['雞蛋%s' %i for i in range(5) if i < 3] #沒有四元表示式
print (l2) #['雞蛋0', '雞蛋1', '雞蛋2']
laomuji=('雞蛋%s' %i for i in range(10)) #生成器表示式 () 省記憶體print(laomuji) #at 0x0000000002552a98>
print(laomuji.__next__())
print(next(laomuji)) #next() 本質就是呼叫__next__
print(next(laomuji)) #雞蛋1
print(next(laomuji)) #雞蛋2
生成器小結:
1.是可迭代的物件
2.實現了延遲機選,省記憶體
3.生成器的本質和其他資料型別一樣,都是實現了迭代器協議,只不過生成器附加了乙個延遲計算記憶體的好處。其餘的可迭代物件沒有這個好處
4.生成器只能遍歷一次, 取完就為空
t = range(3)t1=(i for i in t)
t2=(i for i in t1)
print(list(t1)) #[0, 1, 2]
print(list(t2)) #
day18 檔案處理b(byte)模式
檔案處理的byte模式 f open test2.py 函式預設是 rb 模式,即為讀取模式 讀取乙個byte模式的檔案 rbf open test2.py rb 前提是存在這個可操作的物件 data f.read print data 列印出來的是byte二進位制的模式 print data.de...
C 學習筆記day 18檔案操作
1 文字檔案 寫檔案 include include using namespace std 文字檔案 寫檔案 void test01 intmain 2 文字檔案 讀檔案 include include include using namespace std 文字檔案 讀檔案 void test0...
day7 迭代器和生成器
一邊迴圈一邊計算的機制,只有在呼叫時才會生成相應資料 可以使用isinstance 來判斷乙個物件是否是iterator物件 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以直接用於for迴圈的資料型別有一下幾種 1 集合資料型別,如list tuple dict set st...