文件處理
常用打開文件方式
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)