Python中對open讀取文件內容時的mode模式解析

1.Python可以使用open函數來實現文件的打開,關閉,讀寫操作;

Python3中的open函數定義爲:

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

其中mode列表爲:

'r' #open for reading (default)
'w' #open for writing, truncating the file first
'x' #create a new file and open it for writing,python3新增
'a' #open for writing, appending to the end of the file if it exists
'b' #binary mode
't' #text mode (default),python3新增
'+' #open a disk file for updating (reading and writing)
'U' #universal newline mode (deprecated)

這裏我們主要關心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的讀寫操作

2.'r'

只讀模式,open函數中mode參數的默認模式,文件不存在的話,報FileNotFoundError(python2是IOError);
文件打開後,初始遊標位置爲0;
每次讀都是從遊標位置開始讀;
如果進行了寫操作,會報如下異常:
io.UnsupportedOperation: not writable

3.'w'

只寫模式,文件不存在的話,創建文件;文件存在的話,首先清空文件,然後開始寫;
文件打開後,初始遊標位置爲0;
每次寫都是從遊標位置開始寫;
如果進行了讀操作,首先文件也會被清空,會報如下異常:
io.UnsupportedOperation: not readable

4.'a'

追加模式,文件不存在話,創建文件;文件存在的話,不會清空文件;
文件打開後,初始遊標位置爲文件結尾;
每次寫都是從結尾開始寫;
如果進行了讀操作,同時報如下異常:
io.UnsupportedOperation: not readable

上面的比較好理解,下面就有點繞了

5.'r+'

讀寫模式,文件不存在的話,報FileNotFoundError(python2是IOError);
文件打開後,初始遊標位置爲0;
每次讀寫都是從遊標位置開始;但是對於寫操作,類似於替換操作;
看如下代碼:
文件內容爲:

abcdefg

代碼內容爲:

f = open('open_mode.txt', 'r+')
f.write('xyz')
f.close()

運行代碼後,文件內容變爲:

xyzdefg

6.'w+'

只寫模式,文件不存在的話,創建文件;文件存在的話,首先清空文件;
文件打開後,初始遊標位置爲0;
每次讀寫都是從遊標位置開始;寫操作,類似於替換操作;

7.'a+'

追加模式,文件不存在話,創建文件;文件存在的話,不會清空文件;
文件打開後,初始遊標位置爲文件結尾;
每次寫都是從結尾開始寫;
讀操作從遊標位置開始;

8.'x'

python3新加
創建文件並寫操作,操作必須是不存在的文件,如果操作的文件已存在,則報錯FileExistsError
不可讀,如果進行了讀操作,同時報如下異常:

io.UnsupportedOperation: not readable

9.'b'

二進制形式讀寫文件;
寫數據時,寫入的數據類型必須爲字符串類型,其他類型必須通過json(就是符合json格式的字符串)寫入
python2與python3對於'b’ mode的行爲不同,這和python2與python3的字符串類型有關;事實上,python的字符串類型有兩種;
Python2的兩種字符串類型,分別叫做str和Unicode,str實例包含原始的8位值;而unicode的實例,則包含Unicode字符。
Python2的兩種字符串類型,分別叫做byte和str,與python2不同的是,byte實例包含原始的8位值;而str的實例,則包含Unicode字符。
當讀寫文件採用'b'的模式時,要求必須以二進制形式讀寫,在python2中,字符串必須爲str字符串,python3中必須爲byte字符串;所以在python3,'b'模式下這樣讀寫字符串

s = b'hello world!' #注意是byte字符串
f = open('open_mode.txt','wb')
f.write(s)

或:

s = 'hello world!'f= open('open_mode.txt','wb')
f.write(s.encode(encoding='utf-8'))

不然會報如下錯誤:

Traceback (most recent call last):
File"C:/Users/Desktop/Python/cnblogs/數據類型.py", line 125, in f.write(s)
TypeError: a bytes-like object is required, not 'str'

read文本的相關方法

準備測試數據 test.txt

富強、民主、文明、和諧,
自由、平等、公正、法治,
愛國、敬業、誠信、友善。

python 讀取文件的常用方法open()
讀取的方法,有read(),readline(),readlines()

1.read()

read()方法是讀取整個文件,將整個文件的內容放在一個字符串變量中.
這個方法的缺點就是當文件過大尤其是大於內存時,方法就失效了.

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.read()
    print(res)

直接輸出文件裏的所有內容

富強、民主、文明、和諧,
自由、平等、公正、法治,
愛國、敬業、誠信、友善。

2.readline()

readline()方法是每次只讀取一行,並將讀取的內容放在一個字符串變量中,缺點是這種方法比較慢.

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.readline()
    print(res)

執行的效果爲

富強、民主、文明、和諧,

要想獲取全部的內容,就需要自己手動循環了

#學習中遇到問題沒人解答?小編創建了一個Python學習交流羣:711312441
with open("test.txt", "r", encoding='UTF-8')as f:
    while True:
        line = f.readline()
        if line:
            print(type(line), line)
        else:
            break

結果爲

<class 'str'> 富強、民主、文明、和諧,
<class 'str'> 自由、平等、公正、法治,
<class 'str'> 愛國、敬業、誠信、友善。

3.readlines()

readlines()方法一次性讀取整個文件,並自動將內容分析成一個行的列表:

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.readlines()
    print(res)

結果爲

['富強、民主、文明、和諧,\n', '自由、平等、公正、法治,\n', '愛國、敬業、誠信、友善。']

去掉/n及分割

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.read()
    print(res)
    list = res.replace('\n', ',').split(',')
    print(list)

# 循環lines
with open("test.txt", "r", encoding='UTF-8')as f:
    lines = f.readlines()
    for line in lines:
        print(line)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章