Python 4 種不同的存取檔案騷操作

小詹學Python發表於2018-07-02

前言:最近開始學習tensorflow框架,選修課讓任選一種框架實現mnist手寫數字的識別分類。小詹也就隨著大流選擇了 tf 框架,跟著教程邊學邊做,小詹用了不同的神經網路實現了識別分類,其中有一個步驟是將訓練過程得到的模型進行儲存,在之後的測試中載入並使用該模型。想到這種先儲存再載入呼叫的過程,之前很多地方都遇到過呀,最簡單常用的就是python中檔案的存取哇!於是乎,小詹夜觀星象,就著手整理記錄各種檔案存取的騷操作,具體如下。

(PS:雖然我知道技術文章太長,耐心看完的人很少,曝光率和點贊率會下降,更不會有什麼收益,但是還是想記錄下自己學習過程中的一些筆記,以後自己或者別人查起來方便些!)

推薦閱讀:leetcode打卡記錄帖!

方法預覽

●Python內建方法

●numpy模組方法

●os模組方法

●csv模組方法

Python內建方法

在不需要藉助任何外界庫的前提下,python內建方法其實也可以完成我們需要的檔案存取任務,這裡主要介紹幾種python內建方法的使用方式,最後再給出一個實際案例展示:

  1. open()方法

    file object = open(file_name [, access_mode][, buffering])

    該方法意義在於按照指定模式開啟檔案,其中,各個引數的含義如下:

    file_name:file_name變數是一個包含了你要訪問的檔名稱的字串值。

    access_mode:access_mode決定了開啟檔案的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個引數是非強制的,預設檔案訪問模式為只讀(r)。常用檔案訪問模式見下圖(來源於網路)Python 4 種不同的存取檔案騷操作

    buffering: 如果buffering的值被設為0,就不會有寄存。如果buffering的值取1,訪問檔案時會寄存行。如果將buffering的值設為大於1的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則為系統預設。


  2. close()方法

    fileObject.close()

    File 物件的 close()方法重新整理緩衝區裡任何還沒寫入的資訊,並關閉該檔案,這之後便不能再進行寫入。當一個檔案物件的引用被重新指定給另一個檔案時,Python 會關閉之前的檔案。用 close()方法關閉檔案是一個很好的習慣。

  3. write ()方法

    fileObject.write(string)

    write()方法可將任何字串寫入一個開啟的檔案。需要重點注意的是,Python字串可以是二進位制資料,而不是僅僅是文字。write()方法不會在字串的結尾新增換行符('\n');被傳遞的引數是要寫入到已開啟檔案的內容。


  4. read () 方法

    fileObject.read([count])

    read()方法從一個開啟的檔案中讀取一個字串。需要重點注意的是,Python字串可以是二進位制資料,而不是僅僅是文字。被傳遞的引數是要從已開啟檔案中讀取的位元組計數。該方法從檔案的開頭開始讀入,如果沒有傳入count,它會嘗試儘可能多地讀取更多的內容,很可能是直到檔案的末尾。

  5. 舉例分析

    一般情況,建議小夥伴們使用with ...as...寫法,這種會在執行完程式碼塊後自動close,既可以簡化程式,又可以避免自己粗心或者其他原因造成的不必要錯誤,下面給出一個實際案例。

    #先用open方法開啟(不存在則建立)一個檔案,
    #write方法寫入內容,這裡with寫法不用手動close
    #注意這裡是模式‘a',意味著寫入內容不覆蓋已有內容
    with open('test.txt','a') as file_test:
        file_test.write('小詹是個美男子!\n')
        file_test.write('請關注公眾號【小詹學python】!\n')  複製程式碼
    #注意利用read方法讀取內容,模式要設定為可讀模式
    #read()方法不帶引數,表示預設讀取最長內容
    with open('test.txt','r') as file_test:
        str = file_test.read()
        print(str)
    複製程式碼


    輸出結果會在目錄下多出一個test.txt檔案,並讀取後輸出所有內容,下圖為執行了三次的結果,說明模式‘a'不會覆蓋已有內容(重要的事情說三遍!)

Python 4 種不同的存取檔案騷操作

numpy模組方法

這裡主要介紹numpy模組中的兩個常用方法,用於儲存讀取資料。

np.loadtxt(filename, dtype=int, delimiter=' ')
np.savetxt(filename, a, fmt="%d", delimiter=",")

其中,filename為要儲存或讀取的檔名,a為存取的內容,delimiter為分隔符號。這個使用很簡單,程式碼如下:

import numpy as np

a=np.arange(0,10,0.5).reshape(4,-1)
#改為儲存為整數,以逗號分隔
np.savetxt("a.txt",a,fmt="%d",delimiter=",")
#load時也要指定為逗號分隔
b = np.loadtxt("a.txt",delimiter=",")
print('b=\n',b)
複製程式碼


其執行結果,建立了一個名為’a.txt‘ 的檔案,儲存了陣列,並print列印出來讀取結果,如下圖:

Python 4 種不同的存取檔案騷操作

os模組方法

python中的os模組很強大,提供了許多檔案處理操作的方法。以下列舉出常用的幾種方法。

  1. os.open()

    os.open(file, flags[, mode]);

    其中,引數含義為:

    file -- 要開啟的檔案

    flags -- 該引數可以是以下選項,多個使用 "|" 隔開:

    1. os.O_RDONLY: 以只讀的方式開啟

    2. os.O_WRONLY: 以只寫的方式開啟

    3. os.O_RDWR : 以讀寫的方式開啟

    4. os.O_NONBLOCK: 開啟時不阻塞

    5. os.O_APPEND: 以追加的方式開啟

    6. os.O_CREAT: 建立並開啟一個新檔案

    7. os.O_TRUNC: 開啟一個檔案並截斷它的長度為零(必須有寫許可權)

    8. os.O_EXCL: 如果指定的檔案存在,返回錯誤

    9. os.O_SHLOCK: 自動獲取共享鎖

    10. os.O_EXLOCK: 自動獲取獨立鎖

    11. os.O_DIRECT: 消除或減少快取效果

    12. os.O_FSYNC : 同步寫入

    13. os.O_NOFOLLOW: 不追蹤軟連結

  2. os.rename(current_name,new_name)方法用於更改檔名稱

  3. os.remove(filename)方法用於刪除指定檔案

  4. os.mkdir('newdir')方法用於建立單層目錄,如果該目錄已存在會丟擲異常

  5. os.chdir('newdir')方法用於改變當前工作目錄

  6. os.getcwd()方法獲取當前工作目錄

  7. os.write(fd,str)向指定檔案寫入內容,注意str要轉換成byte

這裡注意針對內容的寫入舉例,注意str要轉換成byte,否則會報錯(a bytes-like object is required, not ‘str’)!

import os
# # 開啟檔案
fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
# # 寫入字串
line = "this is xiaozhan"
b = str.encode(line)
os.write(fd,b)
# #直接寫str報錯:a bytes-like object is required, not ‘str’
os.close(fd)
#以可讀模式開啟
fd = os.open("f1.txt",os.O_RDWR)
ret = os.read(fd,16)
print(ret)
os.close(fd)
print('finish close')
# os.remove('f1.txt')
複製程式碼


執行結果如下:

Python 4 種不同的存取檔案騷操作

csv模組方法

和前幾種方法一樣,主要是讀取和寫入兩個部分。主要依靠csv.reader(),csv.writer()和writerow()方法。和前邊幾種大同小異,這裡直接程式碼中講解基礎的使用方式。

import csv

with open('l.csv', 'w',newline='') as csvfile:
    #csv.writer()方法建立
    eWriter = csv.writer(csvfile)
    #用writerow()方法逐行寫入
    eWriter.writerow(['ID', '名字', '粉絲數量'])
    eWriter.writerow(['xiaoxiaozhantongxue','小詹學python',15000])
    eWriter.writerow(['xiaoxiaozhantongxue','小詹學python',15000])
    eWriter.writerow(['xiaoxiaozhantongxue','小詹學python',15000])

#開啟檔案,用with開啟可以不用去特意關閉file了,python3不支援file()開啟檔案,只能用open()
with open('l.csv','r') as csvfile:
    #讀取csv檔案,返回的是迭代型別
    read = csv.reader(csvfile)
    for i in read:
        print(i)
複製程式碼


執行結果如下圖:

Python 4 種不同的存取檔案騷操作


以上就是本次整理的內容了,方便自己查閱也希望對各位讀者有一丟丟用噢!文章太長,耐心看到這的,我得給你點個贊,送你一個麼麼噠。最後記得點一下?噢!


往期推薦

Python系列之——在北京當房奴的日子~

父親說 | 我不喜歡吃這個,你都吃了吧!

點選閱讀原文,檢視往期打卡記錄!


歡迎掃碼關注,和小詹一起愉快的學習玩耍噢~

Python 4 種不同的存取檔案騷操作


相關文章