Python內置了一個open()方法,用於對本地文件進行讀寫操作。這個功能簡單、實用,屬於必須掌握的基礎知識。
使用open方法操作文件可以分三步走,一是打開文件,二是操作文件,三是關閉文件。下面分別介紹:
一、打開文件
其基本語法:f = open('文件名','打開模式')
打開模式:
r 只讀 默認模式,如果文件不存在就報錯,存在就正常讀取。
w 只寫 如果文件不存在,新建文件,然後寫入;如果存在,先清空文件內容,再寫入。
a 追加 如果文件不存在,新建文件,然後寫入;如果存在,在文件的最後追加寫入。
x 只寫 如果文件存在則報錯,如果不存在就新建文件,然後寫入內容,比w模式更安全。python3以上新增。
+ 讀寫模式 比如r+ w+ a+ (下文詳細說明)
b 二進制模式 比如rb wb ab 這個和bytes類型、字符串類型有關系(下文詳細說明)
還有r+b w+b a+b的組合模式,不在一一列舉
特別強調:
1. b模式:二進制模式,也就是01010101之類的比特流。需要特別注意,它在讀寫的時候是以字節類型(bytes)讀寫的,因此獲得的是一個字節對象而不是字符串。在這個讀寫過程中,需要自己指定字節類型的編碼格式。以write()方法為例進行說明,read()方法也是同樣的。
s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','w') f.write(s) ##這樣沒問題,正常寫入了文件。 ##------------------------------------------------- s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','wb') ##注意多了個b f.write(s) ##報錯 TypeError: a bytes-like object is required, not 'str' ##意思是它需要一個bytes類型數據,你卻給了個字符串 ##--------------------------------------------------- s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','wb') ##注意多了個b f.write(b) ##將變量b傳給它,b是個bytes類型 ##成功執行!
因此,在使用帶b的模式時一定要注意傳入的數據類型。沒有b以字符為單位進行讀寫,有b則以字節為單位讀寫。
2. +模式: 對於w+,事實上這種模式,在讀寫之前都會清空你文件內容,請不要使用!
對於a+模式,事實上這種模式,你永遠只能在文件的末尾寫入,有局限性,請不要使用!
對於r+模式,相對來說最好的讀寫模式,配合seek()和tell()方法,可以實現大部分操作。
二、文件操作方法
在Python3中,基本的文件操作方法有:
class TextIOWrapper(_TextIOBase): def close(self, *args, **kwargs): 關閉文件 pass def fileno(self, *args, **kwargs): 文件描述符 pass def flush(self, *args, **kwargs): 刷新文件內部緩沖區 pass def isatty(self, *args, **kwargs): 判斷文件是否是同意tty設備 pass def read(self, *args, **kwargs): 讀取指定字節數據 pass def readable(self, *args, **kwargs): 是否可讀 pass def readline(self, *args, **kwargs): 僅讀取一行數據 pass def seek(self, *args, **kwargs): # 指定文件中指針位置 pass def seekable(self, *args, **kwargs): 指針是否可操作 pass def tell(self, *args, **kwargs): 獲取指針位置 pass def truncate(self, *args, **kwargs): 截斷數據,僅保留指定之前數據 pass def writable(self, *args, **kwargs): 是否可寫 pass def write(self, *args, **kwargs): 寫內容 pass def __getstate__(self, *args, **kwargs): pass def __init__(self, *args, **kwargs): pass @staticmethod def __new__(*args, **kwargs): # real signature unknown """ Create and return a new object. See help(type) for accurate signature. """ pass def __next__(self, *args, **kwargs): """ Implement next(self). """ pass def __repr__(self, *args, **kwargs): """ Return repr(self). """ pass buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
其中,真正重要的,用得著的是read、readline、readlines、write、tell、seek、flush、close這幾個方法。請注意,沒有直接修改文件內容的方法。下面介紹一下這幾個重點方法:
1.read():可指定一次讀取的數量,比如f.read(10)。如果打開模式沒有b,則read的時候以字符為單位進行讀取,有b則以字節為單位讀取。
2.write():如果打開模式沒有b,則接受普通的字符串為參數;如果有b則需要傳入bytes類型的對象。
3.readline():讀入一行,如果打開模式沒有b,則返回一行字符串;如果有b,則返回bytes類型。可以指定數量參數。
4. readlines():將所有文件按行讀入,如果打開模式沒有b,則返回由各行字符串為元素組成的列表;如果有b,則返回由各行的bytes類型組成的列表。可以指定數量參數。
5.tell():在打開的文件中,維持著一個位置指針,默認剛開始處於文件的頂端,也就是0位置,在讀的過程中,讀走多少,指針就移動多少,並且它永遠是以字節為單位進行計數。因此在使用時一定要注意編碼的問題,否則容易造成讀寫的亂碼。tell方法可以獲取當前指針的位置,使用方法,f.tell()。
6.seek():將指針指向指定的下標處,與tell配合使用,單位是字節。使用方法,f.seek(5)。
7.flush():將剛寫入的內容刷新到本地文件。默認情況下,在文件關閉後,緩存內的數據才會寫入本地文件,這樣可能會造成數據訪問不一致。
為了防止資源洩露,文件破壞,在每次對文件做完操作,我們都要關閉文件。它很簡單,文件句柄.close()就可以。
Python的with語法非常棒,它能幫你自動關閉打開的文件,不需要你手動調用close()方法。
with的基本使用方式如下:
with open('test.txt','w') as f:
f.write('str')
而且在2.7以後的版本中,它還支持同時打開多個文件。
with
open
(
'log1'
) as obj1,
open
(
'log2'
) as obj2:
pass
with不但能管理文件,還能管理別的對象。
當文件被打開後,可以對文件進行逐行迭代:
for line in f:
pass