一、 簡述
在Python3里提供了open函數(shù)來對文件操作,Python2中有file函數(shù) 。
二、打開文件的模式
- r 以只讀方式打開文件,文件指針將會放在文件開頭的位置,這也是默認的模式;
- w 以只寫入的方式打開文件,如果文件存在內(nèi)容,會清空文件后,再打開,文件指針在開頭的位置。如果文件不存在,則創(chuàng)建新文件;
- a 打開文件以追加的模式,如果該文件存在,文件指針會放到文件末尾的位置,也就是說新的內(nèi)容會將被寫入到文件的末尾。如果文件不存在,創(chuàng)建新文件來寫入。
- x Python3里新添加的模式,以只寫入的方式打開文件,文件內(nèi)容如果存在會報錯,否則則創(chuàng)建新文件。一般建議,寫入時使用x而不用w;
- r+ 讀寫模式打開文件,文件指針會在開頭的位置;
- w+ 寫讀模式打開文件,如果文件里有內(nèi)容,就會覆蓋,否則的話,會創(chuàng)建新文件,使用場景還是不多;
- a+ 寫讀模式打開文件,如果存在,文件指針會放在文件的結(jié)尾。文件打開時會是追加模式,如果不存在會創(chuàng)建新的文件;
- x+ 寫讀模式打開文件;
- rb 二進制讀模式打開文件,文件指針會放在文件的開頭;
- rb+ 二進制只讀模式打開文件,文件指針會放在文件的開頭;
- wb 二進制的只寫模式打開文件,如果文件存在會清空文件,否則創(chuàng)建新文件;
- wb+ 二進制寫讀模式,如果文件存在會覆蓋文件,否則會創(chuàng)建新文件;
- xb 二進制只寫,如果文件存在報錯,否則創(chuàng)建新文件。
- xb+ 二進制寫讀模式打開文件,如果存在覆蓋,否則創(chuàng)建新文件。
- ab 二進制追加模式打開文件,如果存在文件,文件指針在末尾,文件打開時會是追加模式,新內(nèi)容在舊內(nèi)容之后,如果文件不存在,創(chuàng)建新文件來寫入。
- ab+ 二進制寫讀模式打開,如果存在文件,文件指針在末尾,如果不存在,創(chuàng)建新文件。
三、常用方法
- open()函數(shù)語法
# 使用open函數(shù)的語法:
file object = open(file_name [, access_mode][, buffering])
'''
file object: 文件句柄,在后面通過此句柄對該文件操作等等;
file_name: 文件名稱,如果不在當前目錄下,需要制定絕對/相對路徑
access_mode: 打開模式,表示允許對文件操作的權(quán)限等
buffering:如果值為0,就不會有寄存。如果為1,訪問文件時會寄存。
如果值設定大于1的整數(shù),說明這就是寄存區(qū)的大小。
如果取負值,寄存區(qū)的緩沖大小則為系統(tǒng)默認。
'''
- closed 如果返回為True表示文件已關(guān)閉,否則為False
>>> f.closed
False
>>> f.close()
>>> f.closed
True
- mode 查看文件打開的模式
>>> f = open('test4.txt','ab+')
>>> f.mode
'ab+'
- name 文件名
>>> f.name
'test4.txt'
- raw 查看文件句柄詳細信息
>>> f.raw
<_io.FileIO name='test4.txt' mode='ab+'>
- encoding 查看編碼
>>> f.encoding
'UTF-8'
- close 關(guān)閉文件句柄
>>> f.close()
- read 讀取指定字節(jié)數(shù)據(jù),如果不指定值,則返回整個文件內(nèi)容
>>> f.read()
'1,2,3abc'
>>> f.read(3)
'1,2'
- readline 僅讀取一行數(shù)據(jù),可以指定讀取的字節(jié)數(shù)
# 文件內(nèi)容三行
>>> f.read()
'1,2,3abc\nABC\nDEF'
>>> f.seek(0)
0
# 一次只讀取一行內(nèi)容
>>> f.readline()
'1,2,3abc\n'
>>> f.tell()
9
>>> f.seek(0)
0
# 可以指定讀取的字節(jié)數(shù)
>>> f.readline(3)
'1,2'
- readlines 讀取所有數(shù)據(jù),并根據(jù)換行符保存內(nèi)容至列表
>>> f.seek(0)
0
# 全部放在列表中
>>> f.readlines()
['1,2,3abc\n', 'ABC\n', 'DEF']
>>> f.seek(0)
0
#對列表可做進一步操作
>>> f.readlines()[0]
'1,2,3abc\n'
- readable 文件是否可讀,可讀返回True,否則返回False
>>> f = open('test.txt','r+')
>>> f.readable()
True
>>> f.close()
>>> f = open('test.txt','a')
>>> f.readable()
False
- write 寫內(nèi)容(字符串)
>>> f.write('balbalbalallla')
14
>>> f.seek(0)
0
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla'
- writelines 寫內(nèi)容,(列表)
#寫入字符串,也OK
>>> f.writelines('這是啥我也不知道')
>>> f.tell()
>>> f.read()
''
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道'
# write寫字符串也ok
>>> s1 = 'daniel'
>>> f.write(s1)
>>> f.writelines(s1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道danieldaniel'
#來試下列表
>>> l1 = ['i','am','is','supperman']
# write失敗
>>> f.write(l1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not list
# writelines沒問題
>>> f.writelines(l1)
>>> f.seek(0)
>>> f.readlines()
['1,2,3abc\n', 'ABC\n', 'DEFbalbalbalallla這是啥我也不知道danieldanieliamissupperman']
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道danieldanieliamissupperman'
#來試下元組
>>> t1 = ('a','b','c','d')
>>> f.write(t1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not tuple
# writelines 是ok的
>>> f.writelines(t1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道danieldanieliamissuppermanabcd'
#測試下字典
>>> d1 = {'k1':'v1','k2':'v2'}
>>> f.write(d1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not dict
# writelines 還是ok的
>>> f.writelines(d1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道danieldanieliamissuppermanabcdk1k2'
- writable 是否可寫,可寫返回True,否則返回False
>>> f.writable()
True
- tell 返回當前指針位置
>>> f.tell()
0
- seek 移動指針位置
>>> f.read()
'1,2,3abc\nABC\nDEF'
>>> f.seek(3)
3
>>> f.read()
',3abc\nABC\nDEF'
- seekable 指針是否可讀,是: True, 否:False, Python3新增
>>> f.seekable()
True
- fileno 返回一個文件的文件描述符,可以用在os模塊的read方法等一些底層的操作
>>> f.fileno()
3
- isatty 判斷文件是否連接在一個終端設備,是:true,否:False
>>> f.isatty()
False
- truncate 截斷文件,截取的字節(jié)通過參數(shù)提供,默認為當前指針位置
>>> f.tell()
0
#看下所有文件內(nèi)容
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla這是啥我也不知道danieldanieliamissuppermanabcdk1k2'
#再把指針指向開始位置
>>> f.seek(0)
0
# 截取三個字符
>>> f.truncate(3)
3
#查看文件指針
>>> f.tell()
0
# 查看文件
>>> f.read()
'1,2'
>>> f.read()
''
>>> f.seek(0)
0
>>> f.read()
'1,2'
>>> f.seek(0)
0
#如果不提供參數(shù),從當前默認的指針位置開始截取,當前為開始位置,所以清空文件內(nèi)容
>>> f.truncate()
0
>>> f.read()
''
>>> f.seek(0)
0
>>> f.read()
- flush 刷寫文件內(nèi)部緩存,直接把緩沖區(qū)的數(shù)據(jù)立即寫入文件,而不是被動的等待緩沖區(qū)寫入。
>>> f.flush()
四、管理上下文
上面的文件操作,打開操作完成之后每次都需要關(guān)閉文件,為了避免忘記,可以通過(with)管理上下文:
'''
打開test.txt文件以r+模式,并別名為f,操作完成后內(nèi)部會自動關(guān)閉并釋放文件資源
'''
with open('test.txt','r+') as f:
pass
另外在python2.7以后,with也支持同事打開兩個文件來操作:
with open('test.txt','r') as f1, open('test2.txt','w') as f2:
pass