1. 程式人生 > >文件操作

文件操作

優點 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()                  #文件結束

文件操作