python中文件的讀寫與打開方式(詳解)


公眾號‘小鵬長翅’同步發布

文件的讀寫是我們經常用到的操作,常用的編程語言都會提供一個內置函數,通過輸入'文件路徑'和'文件打開模式'來打開一個文件對象。

我們來看下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())#讀取全部內容,返回列表,不包括換行符
>>>
['好好學習', '天天向上', '歡迎交流', '一起進步']


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM