文件操作

硬盤纔是我們能永久存放數據的地方,內存只能暫時存放,斷電就會丟失數據.所以我們需要對硬盤進行操作.而操作系統給我們提供了一種對硬盤進行操作的模式: 文件

什麼是文件:

文件是操作系統爲用戶或應用程序提供的一個讀寫硬盤的虛擬單位
文件的操作核心就:讀、寫
即我們只需要對於進行讀寫操作,就是對操作系統發起請求,然後由操作系統將用戶或者應用程序
對文件的讀寫操作轉換成具體的硬盤指令(比如控制盤片轉動,控制機械手臂移動來讀寫數據)
f=open(r'E:\SH_fullstack_s2\day08\a.txt',mode='r') # 向操作系統發起請求,要求操作系統打開文件,佔用操作系統的資源

data=f.read() # 向操作系統打開發起讀請求,會被操作系統轉成具體的硬盤操作,將內容由硬盤讀入內存

f.close() #向操作系統發起請求,要求操作系統關閉文件,回收系統資源

文件的操作有3種:

  • r:read,只讀模式
    1、只能讀,不能寫
    2、在文件不存在時,會報錯,在文件存在的時候會將文件指針移動到開頭
    f=open(r'b.txt',mode='rt',encoding='utf-8')
    data1=f.read()
  • w:只寫模式
    1、只能寫,不能讀
    2、在文件不存在時會創建空文件,在文件存在的時候會將文件內容清空
    f=open(r'c.txt',mode='wt',encoding='utf-8')
    f.write('你好啊我的天\n你好啊我的地\n啊啊啊啊啊啊\n')
  • a:只追加寫模式
    1、只能寫,不能讀
    2、在文件不存在時會創建空文件,在文件存在的時候會將指針移動到文件末尾
    f=open('d.txt',mode='at',encoding='utf-8')
    f.write('555555\n6666\n')
    f.close()
  • b:二進制模式
    1、一定不能指定字符編碼,只有t模式才與字符編碼有關
    2、b是二進制模式,是一種通用的文件讀取模式,因爲所有的文件在硬盤中都是以二進制形式存放的
    讀:f=open('d.txt','rb')
    f.close()

    寫:f=open('e.txt','wb')
        f.write('你好啊'.encode('utf-8'))
        f.close()
    
    追加寫,不存在文件則創建:f=open('e.txt','ab')
                                f.write('大家好'.encode('utf-8'))
                                f.close()

    控制指針移動的三種方式

    f.seek(offset,whence)
    offset代表文件的指針的偏移量,單位是字節bytes
    whence代表參考物,有三個取值
    0:參照文件的開始
    1:參照當前文件指針所在位置
    2: 參照文件末尾
    ps:快速移動到文件末尾f.seek(0,2)
    強調:其中whence=1和whence=2只能在b模式下使用

  • 0 參照文件的開始
    f = open('c.txt', mode='rt', encoding='utf-8')
    f.seek(9, 0) # 從文件的開始往後讀9個字節
    print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
    print(f.readline()) # 從第9個字節開始往後讀
    f.close() # 關閉系統資源
  • 1 參照當前文件指針所在位置
    f = open('c.txt', mode='rb')
    f.readline() # 讀一行
    f.seek(6, 1) # 從當前指針所在位置往後讀6個字節
    print(f.readline().decode('utf-8')) # 從這一行的第6個字節開始讀一行,用utf-8模式打開
    print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
    f.close() # 關閉系統資源
  • 2 參照文件末尾
    f=open('c.txt',mode='rb')
    f.seek(-9,2) # 從文件末尾開始讀,讀9個字節
    print(f.readline().decode('utf-8')) # 從文件末尾的倒數第9個字節開始讀,讀一行
    print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
    f.close()

只有在t模式下的read(n),n代表的是字符個數,除此之外其他但凡涉及文件指針的移動都是以字節爲單位的

f=open('c.txt',mode='rt',encoding='utf-8')
print(f.read(3)) # 讀了三個字符,而不是三個字節
f.close()
  • 1

    f = open('b.txt', mode='at', )
        f.truncate(9)  # 參照物永遠是文件開頭
        f.close()

    修改文件的方式有兩種

    *1 思路:先將原文件內容一次性全部讀入內存,然後在內存修改完畢後,再
    覆蓋寫回原文件
    優點:在修改期間,文件內容只有一份
    缺點:當文件過大的情況下或佔用過多的內存空間
    with open('d.txt','rt',encoding='utf-8') as read_f:
    msg=read_f.read()
    msg=msg.replace('alex','xiang')
    #print(msg)

    with open('d.txt','wt',encoding='utf-8') as write_f:
    write_f.write(msg)

  • 2 思路:
    1、以讀的方式打開原文件,以寫的方式打開一個新文件
    2、從原文件中循環讀取每一行內容修改後寫入新文件
    3、刪除原文件,將新文件重命名爲原文件的名字

    優點:同一時刻只有一行內容存在於內存中
    缺點:在修改期間,文件內容始終存在兩份,但修改完畢後會只留一份
    import os
    with open('d.txt', 'rt', encoding='utf-8') as read_f, \
    open('d.txt.swap', 'wt', encoding='utf-8') as write_f:
    for line in read_f:
    write_f.write(line.replace('xiang', 'ALEXSB'))

    os.remove('d.txt')  # 刪除老文件
    os.rename('d.txt.swap', 'd.txt')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章