Python 文件處理

文件處理

常用打開文件方式

1.讀取文件內容, 模式為 'r' 表示讀, 這也是打開的默認方式。

2.如果要創建或者替換文件, 模式為 'w', 表示寫。

3.為現有文件添加內容, 模式為 'a', 表示追加。

4.如果文件是二進制的, 讀寫都需要添加 'b'。

模式可以組合, 比如 rb 就表示讀取二進制文件, 更多的模式可以使用 dir 查看 open 函數的文檔說明。

不同模式打開文件的列表:

模式 描述
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。一般用于非文本文件如圖片等。
r+ 打開一個文件用于讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。一般用于非文本文件如圖片等。
w 打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在, 創建新文件。一般用于非文本文件如圖片等。
w+ 打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在, 創建新文件。
wb+ 以二進制格式打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在, 創建新文件。一般用于非文本文件如圖片等。
a 打開一個文件用于追加。如果該文件已存在, 文件指針將會放在文件的結尾。也就是說, 新的內容將會被寫入到已有內容之后。如果該文件不存在, 創建新文件進行寫入。
ab 以二進制格式打開一個文件用于追加。如果該文件已存在, 文件指針將會放在文件的結尾。也就是說, 新的內容將會被寫入到已有內容之后。如果該文件不存在, 創建新文件進行寫入。
a+ 打開一個文件用于讀寫。如果該文件已存在, 文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在, 創建新文件用于讀寫。
ab+ 以二進制格式打開一個文件用于追加。如果該文件已存在, 文件指針將會放在文件的結尾。如果該文件不存在, 創建新文件用于讀寫。

打開一個文件需要使用 open() 函數建立一個文件對象:

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])

file: 要訪問的文件名稱。

mode: 打開文件的模式, 默認訪問文件模式是只讀(r)

buffering: 設置 buffer(取值為 0, 1, >1)。如果 buffering 的值被設為 0, 就不會有寄存。如果 buffering 的值取 1, 訪問文件時會寄存行。如果將 buffering 的值設為大于 1 的整數, 表明了這就是的寄存區的緩沖大小。如果取負值, 寄存區的緩沖大小則為系統默認。

encoding: 返回數據的編碼格式。

errors: 報錯級別, 一般為 strict, ignore。當取strict的時候, 字符編碼出現問題的時候, 會報錯, 當取ignore的時候, 編碼出現問題, 程序會忽略而過, 繼續執行下面的程序。

newline: 用于區分換行符, 這個參數只對文本模式有效, 可以取的值有 None, '\n', '\r', '', '\r\n'

closefd: 取值與傳入的文件參數有關, 默認情況下為 True, 傳入的 file 參數為文件的文件名, 取值為 False 的時候,file 只能是文件描述符, 什么是文件描述符, 就是一個非負整數, 在 Unix 內核的系統中, 打開一個文件, 便會返回一個文件描述符。

例如:

f = open('a.txt', 'r') # 以只讀方式打開 a.txt

close() 方法

文件對象的 close() 方法刷新緩沖區里任何還沒寫入的信息, 并關閉該文件,這之后便不能再進行寫入。

當一個文件對象的引用被重新指定給另一個文件時,Python 會關閉之前的文件。用 close()方法關閉文件是一個很好的習慣。

使用語法如下:

f = open('a.txt', 'r')
f.close()

讀文件

讀文件的常用方法:

read(): 一次性讀取文件的所有內容。

read(size): 讀取 size 個字節的內容。

readline(): 逐行讀取文本,結果是一個 list(列表)

readlines(): 一次性地按行讀取全部內容, 存入一個 list(列表)

寫文件

寫文件的常用方法:

write(str): 將 str 寫入文件。write()并不會在 str 后加上一個換行符。

writelines(seq): 把 seq 的內容全部寫到文件中(多行一次性寫入)。這個函數也只是忠實地寫入,不會在每行后面加上任何東西。

Python File(文件) 其他方法:

file 對象使用 open() 函數來創建, 下面是一些常用的函數

函數 作用
file.flush() 刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
file.fileno() 返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
file.isatty() 如果文件連接到一個終端設備返回 True,否則返回 False。
file.next() 返回文件下一行
file.seek(offset[, whence]) 設置文件當前位置
file.tell() 返回文件當前位置
file.truncate([size]) 截取文件, 截取的字節通過size指定, 默認為當前文件位置。

with-文件上下文管理器

文件操作可能會出現異常(例如要操作的文件不存在等), 拋出異常會影響 close() 方法正確關閉文件。如果想保證 close() 方法的執行, 可以使用如下方法處理異常:

try:
    f = open('a.txt', 'r')
    print(f.read())
finally:
    f.close()

Python 的文件對象支持 with 語法, 上面代碼的效果可以用如下代碼實現:

with open('a.txt', 'r') as f:
    print(f.read())

with 上下文管理器在執行完代碼塊之后, 會自動調用文件對象的 close() 方法, 使用 with ... as ... 語法, 可以更簡潔。

json/pickle 存儲 Python 對象

如果我們需要存儲的不是字符串, 而是 Python 內置的數據結構或者是一些自定義的類對象, 這時候就需要通過某種方式將需要存儲的 Python 對象轉換為字符串或者二進制內容存放, 這個過程叫做 序列化, 從字符串轉換成對象叫做 反序列化

下面是 json 和 pickle 模塊完成序列化的簡單操作:

In: import json
In: import pickle

In: my_dict = {'a': [1, 2, 3], 'b': 123}
In: json_data = json.dumps(my_dict)
In: pickle_data = pickle.dumps(my_dict)

In: json_data
Out: '{"a": [1, 2, 3], "b": 123}'

In: pickle_data
Out: b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01]q\x02(K\x01K\x02K\x03eX\x01\x00\x00\x00bq\x03K{u.'

將序列化的結果寫入文件的操作如下:

with open('data.json', 'w') as f:
    f.write(json_data)

with open('data.json') as f:
    data = json.loads(f.read()) # loads() 方法反序列化
    print(data)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380