天天看點

檔案操作

一,檔案操作基本流程。

計算機系統分為:計算機硬體,作業系統,應用程式三部分。

我們用python或其他語言編寫的應用程式若想要把資料永久儲存下來,必須要儲存于硬碟中,這就涉及到應用程式要操作硬體,衆所周知,應用程式是無法直接操作硬體的,這就用到了作業系統。作業系統把複雜的硬體操作封裝成簡單的接口給使用者/應用程式使用,其中檔案就是作業系統提供給應用程式來操作硬碟虛拟概念,使用者或應用程式通過操作檔案,可以将自己的資料永久儲存下來。

有了檔案的概念,我們無需再去考慮操作硬碟的細節,隻需要關注操作檔案的流程:

檔案操作
#1. 打開檔案,得到檔案句柄并指派給一個變量
f=open('a.txt',mode='r',encoding='utf-8') #預設打開模式就為r

#2. 通過句柄對檔案進行操作
data=f.read()
      
#3.f.flush()         # 重新整理管道      
#4.f.close()         #關閉檔案      
使用with關鍵字來管理上下文,檔案件運作完後會自動關閉,不用寫f.close()
with open('a.txt','w') as f:
    pass
可以一次性操作多個檔案句柄 
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)      
檔案操作

二,檔案編碼

f=open(...)是由作業系統打開檔案,那麼如果我們沒有為open指定編碼,那麼打開檔案的預設編碼很明顯是作業系統說了算了,

作業系統會用自己的預設編碼去打開檔案,在windows下是gbk,在linux下是utf-8。

#這就用到了上節課講的字元編碼的知識:若要保證不亂碼,檔案以什麼方式存的,就要以什麼方式打開。
f=open('a.txt','r',encoding='utf-8')      

三,檔案的打開模式

檔案句柄 = open(‘檔案路徑’,‘模式’)

檔案操作
#1. 打開檔案的模式有(預設為文本模式):
r ,隻讀模式【預設模式,檔案必須存在,不存在則抛出異常】
w,隻寫模式【不可讀;不存在則建立;存在則清空内容】
a, 隻追加寫模式【不可讀;不存在則建立;存在則隻追加内容】

#2. 對于非文本檔案,我們隻能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式存儲的,
    使用這種模式無需考慮文本檔案的字元編碼、圖檔檔案的jgp格式、視訊檔案的avi格式)
rb 
wb
ab
注:以b方式打開時,讀取到的内容是位元組類型,寫入時也需要提供位元組類型,不能指定編碼

#3,‘+’模式(就是增加了一個功能)
r+, 讀寫【可讀,可寫】
w+,寫讀【可寫,可讀】
a+, 寫讀【可寫,可讀】

#4,以bytes類型操作的讀寫,寫讀,寫讀模式
r+b, 讀寫【可讀,可寫】
w+b,寫讀【可寫,可讀】
a+b, 寫讀【可寫,可讀】      
檔案操作

 四,檔案操作方法。

4.1常用操作方法。

read(3):

  1. 檔案打開方式為文本模式時,代表讀取3個字元

  2. 檔案打開方式為b模式時,代表讀取3個位元組

  其餘的檔案内光标移動都是以位元組為機關的如:seek,tell,truncate

注意:

  1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為機關移動的

  2. truncate是截斷檔案,是以檔案的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空檔案了,是以truncate要在r+或a或a+等模式下測試效果。

絕對路徑:從磁盤根目錄尋找檔案

相對路徑:相對于你目前檔案所在的位置(運作檔案時,不用寫路徑,直接寫檔案名)

        read:一次性全部讀出來

  readline:一行一行讀

  readlines:一次性全部讀出來,以行為機關放在一個清單中

  read(n):讀一部分

  for:循環讀取          不占記憶體,最好

write:

w
#沒有檔案,建立一個檔案寫入内容
# f = open('log1',encoding='utf-8',mode='w')
# f.write('兒科王金發')
# f.close()
#有檔案,将原檔案内容清空,在寫入内容。
# f = open('log1',encoding='utf-8',mode='w')
# f.write('666')
# f.close()      
# wb
# f = open('log',mode='wb')
# f.write('老男孩教育'.encode('utf-8'))
# f.close()      
# a
#沒有檔案,建立一個檔案追加内容
# f = open('log2',encoding='utf-8',mode='a')
# f.write('666')
# f.close()
# 有檔案,直接追加内容。
# f = open('log2',encoding='utf-8',mode='a')
# f.write('666')
# f.close()      
# r+ 先讀,後追加 一定要先讀後寫       在r+模式下,如果讀取了内容,不論讀取内容多少,光标顯示的是多少,再寫入或者操作檔案時都是在結尾進行操作
# f = open('log',encoding='utf-8',mode='r+')
# content = f.read()
# print(content)
# f.write('aaa')
# f.close()      
# w+ 先寫後讀。
# f = open('log',encoding='utf-8',mode='w+')
# f.write('中國')
# #print(f.tell())  # 按位元組去讀光标位置
# f.seek(3)  # 按照位元組調整光标位置          seek(0,2)光标移到結尾,seek(0)光标移到開頭
# print(f.read())
# f.close()      
#a+ 追加讀,在最後追加内容,在讀。(讀不到内容)
# f = open('log',encoding='utf-8',mode='a+')
# f.write('BBB')
# content = f.read()
# print(content)
# f.close()      
# f = open('log',encoding='utf-8',mode='a')
# f.truncate(7) # 按位元組對原檔案截取
# f.close()
如果沒有參數. 根據光标的位置. 保留光标前面的内容,後面的内容删除。  f.truncate()
如果給了參數. 會把檔案從頭到參數之間的内容保留,其他的全部删掉   f.truncate(7)      
修改檔案内容:
# 1,将原檔案讀取到記憶體。
# 2,在記憶體中進行修改,形成新的内容。
# 3,将新的字元串寫入新檔案。
# 4,将原檔案删除。
# 5,将新檔案重命名成原檔案。
import os
with open('log',encoding='utf-8') as f1,\
    open('log.bak',encoding='utf-8',mode='w') as f2:
    for i in f1:
        new_i = i.replace('SB','alex')
        f2.write(new_i)
os.remove('log')
os.rename('log.bak','log')