文件操作
阿新 • • 發佈:2017-05-15
優點 cde tab 實時 刷新 new mov end family
參數
f = open("aa",mode="r",encoding="utf-8")
#定義名 = open("文件名","模式",指定打開字符集方式)
f.name #查看db文件名
f.tell() 顯示文件中,當前 光標位置
f.read() 讀全部 (read是讀字符 其他都是字節),f.read(5)讀取5個字符
f.readline() 讀一行 讀取成列表形式
f.wirte() 寫入
f.close() 關閉
f.seek(10) 移動10個字節 #f.seek(0,2)光標移動到最後操作 (對字節操作,utf-8中,漢字代表3個字節
f.encoding 查看字符編碼
f.writable() 是否以寫模式打開, #True為真 False為假
f.readable() 是否以讀模式打開, #True為真 False為假
f.flush() 強制刷新到硬盤 #一般用於打印實時日誌,基本不用,會導致硬盤速度變慢
文件讀取模式
f = open("aa",mode="r",encoding="utf-8")
#定義名 = open("文件名","模式",指定打開字符集方式)
r #讀(指定文件名,需要手動創建文件) 先創建文件aa 讀取文件 f = open("aa",mode="r",encoding="utf-8") #默認是r 不加r也行 f.read() #讀取文件到內存 print(f.readline(),end="") #end="" 替換\n(可改),效果:結尾不會換行了, 註:print參數結尾默認是\n, print(f.writable()) #是否以寫模式打開, #True為真 False為假 print(f.readable()) #是否以讀模式打開, #True為真 False為假 f.close() #結束 #讀取文件4個字符,\n也算字符with open("aa","r",encoding="utf-8")as f :print(f.read(4)) w #寫(沒文件則創建,已有文件則清空並寫入文件內容 ) f = open("aa",mode="w",encoding="utf-8") #lyric是操作文件. mode="w" 寫入模式 模式可替換. encoding="utf-8" 用utf-8格式打開lyric文件, f.write("wirte one work...\n") #\n 換行 write是寫入參數 f.write ("wirte seven eight nine ten\n") f.close() #結束 ------------------------------------------------------------------- rs = ["aa","bb","cc"] f = open("lyric","w") #打開lyric的寫功能(lyric文件存在,則清空數據) for i in rs: #i是rs(內存中黑名單的元素) f.write(str(i)+"\n") #f.write 寫入數據 str(i)+"\n" 寫入i的每個值到lyric中,\n另起一行 f.close() #文件結束 a #追加(沒文件則創建,已有文件則追加文件內容) f = open("a1a1",mode="a",encoding="utf-8") #aa是操作文件. mode="w" 寫入模式 模式可替換. encoding="utf-8" 用utf-8格式打開lyric文件, f.write("wirte one work...\n") #\n 換行 f.write ("wirte seven eight nine ten\n") f.close() #結束 #"+" 表示可以同時讀寫某個文件 r+ #先讀,後追加 #可以指定長度修改 w+ #先清空+,後追加 a+ #先追加,後讀取 #U表示 將\r \n \r\n自動轉換成\n (windows中換行是\r\n linux中換行是\n rU #r和U的組合 r+U #r+和U的組合 #b表示 處理二進制文件,對所有文件都能讀取 rb 以2進制模式打開文件,不能聲明encoding(不能指定字符類型,默認是二進制格式) #with...as... 優點:讀取完文件自動關閉 with open("aa","rb")as f : print(f.read().decode("utf-8")) #decode 轉成**模式顯示 wb 以二進制寫入文件,必須寫入bytes格式 f = open("111","wb") #111是文件 f.write("guo 1 哈哈".encode("utf-8")) #寫入時必須指定寫入的編碼類型 print(f) f.close() ab 以二進制追加文件,必須寫入bytes格式 f = open("111","ab") #111是文件 f.write("guo 1 哈哈\n".encode("utf-8")) #追加時必須指定寫入的編碼類型 print(f) f.close() rb+ #以二進制形式先讀,後追加 #可以指定長度修改 wb+ #以二進制形式先清空+,後追加 ab+ #以二進制形式先追加,後讀取
文件兩種修改方式
模式1
#讀取文件修改後,保存到內存,再覆蓋原文件 #弊端占內存,優點省硬盤空間 #文件lyric手動創建,寫內容(文件包含aa) f = open("lyric",mode="r",encoding="utf-8") #定義變量f=打開lyric文件,模式:"讀",encoding="utf-8"訪問文件編碼 data = f.read() #定義變量data為讀取文件內容 data = data.replace("aa","bb") #replace文件替換, aa全部替換為bb f.close() #讀模式結束 f=open("lyric",mode="w",encoding="utf-8") #定義變量f=打開lyric文件,模式:"寫",encoding="utf-8"訪問文件編碼 f.write(data) #內存文件內容,寫入到文件(原文件清空) f.close() #寫模式結束 模式2
#f文件每讀一行並修改後,寫入到f_new文件 #弊端占硬盤空間,優點省內存空間 import os #工具箱 f = open("lyric",mode="r",encoding="utf-8") #定義變量f=打開lyric文件,模式:"讀",encoding="utf-8"訪問文件編碼 f_new= open("lyric_new",mode="w",encoding="utf-8") #定義變量f_new=打開lyric_new文件,模式:"寫",encoding="utf-8"訪問文件編碼 for line in f: if "aa" in line: line = line.replace("aa","bb") #replace文件替換, aa全部替換為bb f_new.write(line) f.close() #讀模式結束 f_new.close() #寫模式結束 os.remove("lyric") #刪除lyric文件 os.rename("lyric_new","lyric") #lyric_new改名為lyric
#讀取aa和bb文件操作 讀取aa和bb文件 with open("aa","r",encoding="utf-8") as f_aa, open("bb") as f_bb: print(f_aa.read()) print(f_bb.read()) 讀取aa文件寫入到bb with open("aa","r",encoding="utf-8") as f_aa, open("bb","w",encoding="utf-8") as f_bb: tow_f=f_aa.read() f_bb.write(tow_f) 讀取aa文件追加到bb with open("aa","r",encoding="utf-8") as f_aa, open("bb","a",encoding="utf-8") as f_bb: tow_f=f_aa.read() f_bb.write(tow_f)
2個文件轉列表,轉字典,轉成列表中的N個字典
#db文件格式 #aa #bb #cc #讀取db文件生成列表 goods =[] for gn in open("goods","rt",encoding="utf-8"): goods.extend(gn.strip().split()) price =[] for en in open("price","rt",encoding="utf-8"): price.extend(en.strip().split()) print(price) #2個列表合並成字典 shop=dict(zip(goods,price)) print(shop) #字典轉成列表的子集添加n個字典 test = [] for k, v in shop.items(): test.append({"name": k, "m": v}) print(test)
一個文件轉成列表中的N個字典
f2 = open(‘product‘, ‘r‘, encoding=‘utf-8‘) product_data = f2.read() f2.close() v = product_data.split(‘\n‘) print(v) # 將列表轉換成字典 lin = [] for i in v: v1 = i.split(‘:‘) print(v1) v1[1] = int(v1[1]) dic = {v1[0]:v1[1]} lin.append(dic) print(lin)
光標問題
cuisor讀取光標地址, read讀取文件全部內容, seek 把光標移動到某個字節後面 f.seek(10) 代表移動10個字節(utf-8中,漢字代表3個字節) 創建文件lyric,填寫內容如下 123456testABCDE my name is guolm python執行命令: >>>f = open("lyric","r",encoding="utf-8") #encoding 指定讀取文件類型的格式 >>>print(‘cuisor:‘,f.tell()) #f.tell()顯示當前文件內光標位置, cuisor: 0 >>>print(f.read()) #讀取f變量中全部內容, 如果是print(f.readline()) 讀取一行內容 123456testABCDE my name is guolm >>>print("--------------------------------------") >>>print(‘cuisor:‘,f.tell()) #f.tell()再次執行,28是當前光標所在字符位置 cuisor: 33 >>>print(f.read()) #上次執行read()讀取全部,本次讀取文件從最後執行,所有沒內容 >>>print("--------------------------------------") >>>f.seek(10) #f.seek(10) 代表移動10個字節後面, f.seek(0)移動到開頭 (utf-8中,漢字代表3個字節) >>>print("cursor:",f.tell()) #因為上邊操作,光標從10字節之後,執行命令 cursor: 10 >>>print(f.read(5)) #讀取5字符 註:漢字代表一個字符,每行的結尾(\n)也代表一個字符 ABCDE >>>f.close() #文件結束
文件操作