天天看點

python檔案操作

  檔案操作分為讀、寫、修改,以什麼模式存檔案,就以什麼模式編碼打開檔案。

一、檔案處理模式

  • r,隻讀模式(預設)。
# 以什麼模式存檔案,就以什麼模式編碼打開檔案
# 示例一:r是文本隻讀模式
f = open(file='D:/工作/兼職聯系資訊.txt',mode='r',encoding='utf-8')  # 絕對路徑通路
data = f.read()
f.close()

# 示例二:rb:二進制隻讀模式,無法指定encoding,因為在該模式下資料讀到記憶體裡直接是bytes格式,如要檢視内容還需手動decode
f = open(file='兼職聯系資訊.txt', mode='rb')      
  •  w,隻寫模式。【不可讀;不存在則建立;存在則删除内容;】
# w模式是建立新檔案,如果檔案存在則清空重寫
f = open(file='兼職.txt',mode='w',encoding='gbk')
f.write('美女按摩服務,電話号:adfs123')
f.close()      
  •  a,追加模式。【可讀;   不存在則建立;存在則隻追加内容;】
# a是追加模式
f = open('兼職聯系資訊.txt', 'ab')
f.write("\n白百何  北京  167  55  13523230322".encode("gbk"))   # 換行追加
f.close()      
  •  循環檔案
f = open("兼職白領學生空姐模特護士聯系方式.txt",'r',encoding="utf-8")

for line in f:
    print(line)

f.close()      

二、混合模式

  "+" 表示可以同時讀寫某個檔案

  •  r+,可讀寫檔案。【可讀;可寫;可追加】
f = open('兼職聯系資訊.txt','r+',encoding="gbk")
data = f.read()
print("content",data)

f.write("\nnewline 1老師")
f.write("\nnewline 2老師")
f.write("\nnewline 3老師")
f.write("\nnewline 4老師")

print("new content", f.read())
# read不到結果,因為寫入後光标已經移到末尾

f.close()      
  •  w+,寫讀
# 寫讀是以建立的模式打開(将原來的東西覆寫),可以讀取寫入的内容
f = open("兼職聯系資訊.txt",'w+',encoding="gbk")
data = f.read()
print("content", data)

f.write("\nnewline 1學生")
f.write("\nnewline 2學生")
f.write("\nnewline 3學生")
f.write("\nnewline 4學生")

print("new content",f.read())

f.close()      
  • a+,同a

"U"表示在讀取時,可以将 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)

  •  rU
  •  r+U

三、二進制處理

  "b"表示處理二進制檔案(如:FTP發送上傳ISO鏡像檔案,linux可忽略,windows處理二進制檔案時需标注)

  •  rb
# rb:二進制隻讀模式,無法指定encoding,因為在該模式下資料讀到記憶體裡直接是bytes格式,如要檢視内容還需手動decode
f = open(file='兼職聯系資訊.txt', mode='rb')      
  • wb
f = open('兼職2.txt','wb')  # 寫二進制
f.write("美女陪聊!".encode("gbk"))
f.close()      
  • ab
f = open('兼職聯系資訊.txt', 'ab')
f.write("\n白百何  北京  167  55  13523230322".encode("gbk"))   # 換行追加
f.close()      

四、檔案智能檢查(chardet)

  可解決不清楚要處理檔案是什麼編碼的問題

import chardet   # chardet需要用pip安裝第三方工具包(pip3 install chardet)

f = open('兼職聯系資訊.txt',mode='rb')
data = f.read()
f.close()
result = chardet.detect(data)  # 檢查檔案編碼格式
print(result)  # 輸出如下結果
"""
{'encoding': 'utf-8', 'confidence': 0.87625, 'language': ''}
"""
data.decode("utf-8")   # 解碼

# 修改編碼後檢視檔案資訊
f = open('兼職聯系資訊.txt',mode='r',encoding='utf-8')
data = f.read()
print(data)      

五、檔案操作其他功能

f = open("兼職.txt",mode="r+",encoding="gbk")

f.fileno() # 傳回檔案句柄在核心中的索引值,做IO多路複用可以用到

f.flush()  # 把檔案從記憶體buffer裡強制重新整理到硬碟

f.readable()  # 判斷是否可讀

f.readline()  # 隻讀一行,遇到\r  \n 為止

f.seek()      # 把操作檔案的光标移到指定位置(按位元組)
f.seek(0)     # 光标移動到文首

f.seekable()  # 判斷檔案是否可進行seek操作

f.tell()      # 傳回目前檔案操作光标位置(按位元組)

f.truncate()  # 按指定長度截斷檔案(需要寫權限),從光标目前位置開始往後截斷
f.truncate(6) # 加上數字是從頭開始截取6位位元組

f.writable()  # 判斷檔案是否可寫

f.read()      # 按字元,注意和tell和seek的差別      

六、檔案修改

1、在指定位置修改檔案

# 修改檔案時,先移動光标到指定位置,向檔案寫入内容
f = open(file = '兼職模特聯系方式.txt',mode='a',encoding='gbk')

f.write("安琪 170 50 13988888")
f.write("白雪 167 48 13324434")
f.write("劉琳 166 46 13828382")

f.seek(22)      # 移動光标到指定位置插入檔案
f.write("\n")

f.seek(42)
f.write("\n")

f.seek(62)
f.write("\n")

f.seek(0)
f.read()

f.close()      

2、檔案修改時占有硬碟,減少記憶體使用

mport os

f_name = "兼職模特聯系方式.txt"

f_new_name = "%s.new" %f_name
old_str = "白雪"
new_str = "白百合"

f = open(f_name,mode='r',encoding='utf-8')
f_new = open(f_new_name,'w',encoding='utf-8')

for line in f:
    if old_str in line:
        line = line.replace(old_str,new_str)

    f_new.write(line)
f.close()
f_new.close()

os.rename(f_new_name,f_name)    # 新檔案替代舊檔案