python文件操做

  文件操做分爲讀、寫、修改,以什麼模式存文件,就以什麼模式編碼打開文件。linux

1、文件處理模式

  • 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()

2、混合模式

  "+" 表示能夠同時讀寫某個文件windows

  •  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+ 模式同使用)ide

  •  rU
  •  r+U

3、二進制處理

  "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()

4、文件智能檢查(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)

5、文件操做其餘功能

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的區別

6、文件修改

一、在指定位置修改文件

# 修改文件時,先移動光標到指定位置,向文件寫入內容
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()

二、文件修改時佔有硬盤,減小內存使用

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)    # 新文件替代舊文件
相關文章
相關標籤/搜索