公眾號‘小鵬長翅’同步發布
文件的讀寫是我們經常用到的操作,常用的編程語言都會提供一個內置函數,通過輸入'文件路徑'和'文件打開模式'來打開一個文件對象。
我們來看下python中的文件讀寫操作
一、Python中的文件打開模式
| 打開模式 | 用法 |
|---|---|
| r | 以只讀的方式打開文件,若文件不存在,會報錯 |
| r+ | 可以同時讀寫,若文件不存在,會報錯,寫入時是覆蓋寫入 |
| w | 以只寫的方式打開文件,若文件不存在則新建,寫入時是清空寫入 |
| w+ | 可以同時讀寫,若文件不存在則新建,寫入時是清空寫入 |
| a | 以只追加可寫模式打開文件,若文件不存在則新建 ,寫入時是追加寫入 |
| a+ | 可以同時讀寫,若文件不存在則新建,寫入時是追加寫入 |
下面我們分別試一下這幾種打開模式的用法(open)
我們先在D盤創建一個note1.txt文件

r 只讀
filepath = r'D:\note1.txt'#找到文件的路徑
file1 = open(filepath,'r',encoding='utf-8')
print(file1.read())#read()函數--讀取全部內容,后有詳解
#通過只讀'r'的方式打開文件
#因為文件里是中文,所以我們指定編碼方式為‘utf-8’
#'r'是open函數中‘打開方式’的缺省值,可以省略
file1.close()#關閉文件 使用open()時,必須要有close(),否則會一直占用內存
>>>
好好學習
天天向上
用只讀'r'打開一個不存在的文件'note2.txt',則會報錯
filepath = r'D:\note2.txt'#一個不存在的文件
file1 = open(filepath,'r',encoding='utf-8')#通過讀'r'的方式打開文件
print(file1.read())
file1.close()#關閉文件 使用open()時,必須要有close(),否則會一直占用內存
>>>報錯
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\note2.txt'
r+ 讀寫--覆蓋寫入
filepath = r'D:\note1.txt'
file1 = open(filepath,'r+',encoding='utf-8')#通過'r+'的方式打開文件
file1.write('歡迎交流')#以覆蓋寫入的方式寫入'歡迎交流'
file1.seek(0)#seek(n):光標回到文件首位,之后偏移n位
print(file1.read())
file1.close()
>>>
歡迎交流#可以發現,'歡迎交流'覆蓋了'好好學習'
天天向上
需要注意的是我們這塊用到了一個seek(n)函數,這是因為我們寫入內容后,光標位置在剛寫入內容的后邊,而讀取文件內容時,是從光標的位置開始往后讀,這時候就需要移動下光標位置以能獲取文件全部內容。
我們看下上邊例子中,不使用seek移動光標,輸出的內容。
filepath = r'D:\note1.txt'
file1 = open(filepath,'r+',encoding='utf-8')
file1.write('歡迎交流')#寫入之后,光標停在'流'字后邊
#file1.seek(0)#seek(n):
print(file1.read())
file1.close()
>>>
天天向上#只會讀取出光標后邊的內容
用'r+'打開一個不存在的文件'note2.txt',同樣會報錯
filepath = r'D:\note2.txt'#一個不存在的文件
file1 = open(filepath,'r+',encoding='utf-8')#通過'r+'的方式打開文件
print(file1.read())
file1.close()
>>>報錯
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\note2.txt'
w 只寫
只寫‘w’方式,想讀取文件內容,會報錯
filepath = r'D:\note1.txt'
file1 = open(filepath,'w',encoding='utf-8')#通過只寫'w'的方式打開文件
print(file1.read())#讀取文件內容
file1.close()
>>>報錯
io.UnsupportedOperation: not readable
在已存在的文件中進行寫入
會清空文件中之前的內容
filepath = r'D:\note1.txt'
file1 = open(filepath,'w',encoding='utf-8')#通過只寫'w'的方式打開文件
file1.write('歡迎交流')
file1.close()
然后我們看下note1.txt,確實清空了之前的內容

只寫‘w’方式打開不存在的文件,會新建文件並寫入內容
filepath = r'D:\note_new.txt'#不存在的文件
file1 = open(filepath,'w',encoding='utf-8')#通過只寫(w)的方式打開文件
file1.write('這是個新文件')
file1.close()
然后去我們的D盤查看,確實多了一個note_new.txt的文件

w+ 讀寫--清空寫入
'w+'比'w'模式多了同時讀寫的功能,其他完全一樣。
filepath = r'D:\note_new.txt'#不存在的文件
file1 = open(filepath,'w+',encoding='utf-8')#通過'w+'的方式打開文件
file1.write('這是個新文件')
file1.seek(0)#光標回到首位
print(file1.read())
file1.close()
>>>>
這是個新文件
a 只寫--追加寫入
我們經常會有這樣的需求,在寫入內容時不想刪除之前的內容。
打開模式'a'就可以滿足。
與打開模式'w'唯一的區別就是寫入方式為'追加寫入'
也可以理解為比'w'方式多了一個'把光標移到末尾'的操作
filepath = r'D:\note1.txt'
file1 = open(filepath,'a',encoding='utf-8')#通過追加寫'a'的方式打開文件
file1.write('歡迎交流')#追加寫入內容
file1.close()
然后我們看下note1.txt
確實以追加的方式寫入了內容

a+ 讀寫--追加寫入
'a+'比'a'模式多了同時讀寫的功能,其他完全一樣。
filepath = r'D:\note1.txt'
file1 = open(filepath,'a+',encoding='utf-8')#通過'a+'的方式打開文件
file1.write('\n一起進步')#追加寫入內容
file1.seek(0)#把光標移到首位
print(file1.read())
file1.close()
>>>
好好學習
天天向上
歡迎交流
一起進步
二、with open
為了避免忘記或者為了避免每次都要手動關閉文件,我們可以使用with語句
用法與open()一樣
優點:
1)它可以處理多個文件
2)不需要寫close()方法
filepath1 = r'D:\newfile1.txt'
filepath2 = r'D:\newfile2.txt'
with open(filepath1,'w+') as file1,open(filepath2,'w+') as file2:
#同時打開兩個新建文件
file1.write('good good study')#文件1寫入內容
file2.write('day day up')#文件2寫入內容
file1.seek(0)#文件1光標移到首位
file2.seek(0)#文件2光標移到首位
print(file1.read())
print(file2.read())
>>>
good good study
day day up
此時D盤也多了兩個文件,且內容也是我們寫入的內容

三、文件讀取相關方法
| 方法 | 作用 |
|---|---|
| read() | 讀取文件全部內容,返回值是字符串 |
| readline() | 讀取一行的內容,返回值是字符串 |
| readlines() | 逐行讀取文件所有內容,返回值是列表 |
| read().splitlines() | 讀取文件全部內容,返回值是列表,不出現 |
下面我們分別試下這幾種方法
先建一個new_file.txt,內容如下

- read()
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:#打開文件
print(file.read())使用read()讀取全部內容
>>>
好好學習
天天向上
歡迎交流
一起進步
read()也可以填一個參數,用來讀取指定長度的內容
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:#打開文件
print(file.read(3))#獲取3個字符
>>>
好好學
- readline()
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:#打開文件
print(file.readline())#讀取一行內容,返回字符串
>>>
好好學習
- readlines()
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:
print(file.readlines())#讀取一行內容,返回列表
>>>
['好好學習\n', '天天向上\n', '歡迎交流\n', '一起進步']
- read().splitlines()
splitlines() 按照行('\r', '\r\n', \n')分隔,返回一個包含各行作為元素的列表,如果參數 keepends 為 False(默認為False),不包含換行符,如果為 True,則保留換行符
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:
print(file.read().splitlines())#讀取全部內容,返回列表,不包括換行符
>>>
['好好學習', '天天向上', '歡迎交流', '一起進步']
