這篇文章給大家分享的是有關(guān)python讀寫文件操作的方法的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司是專業(yè)的青白江網(wǎng)站建設(shè)公司,青白江接單;提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行青白江網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
I/O操作概述
文件讀寫實現(xiàn)原理與操作步驟
文件打開模式
Python文件操作步驟示例
Python文件讀取相關(guān)方法
文件讀寫與字符編碼
I/O在計算機(jī)中是指Input/Output,也就是Stream(流)的輸入和輸出。這里的輸入和輸出是相對于內(nèi)存來說的,Input Stream(輸入流)是指數(shù)據(jù)從外(磁盤、網(wǎng)絡(luò))流進(jìn)內(nèi)存,Output Stream是數(shù)據(jù)從內(nèi)存流出到外面(磁盤、網(wǎng)絡(luò))。程序運行時,數(shù)據(jù)都是在內(nèi)存中駐留,由CPU這個超快的計算核心來執(zhí)行,涉及到數(shù)據(jù)交換的地方(通常是磁盤、網(wǎng)絡(luò)操作)就需要IO接口。
那么這個IO接口是由誰提供呢?高級編程語言中的IO操作是如何實現(xiàn)的呢?
操作系統(tǒng)是個通用的軟件程序,其通用目的如下:
硬件驅(qū)動
進(jìn)程管理
內(nèi)存管理
網(wǎng)絡(luò)管理
安全管理
I/O管理
操作系統(tǒng)屏蔽了底層硬件,向上提供通用接口。因此,操作I/O的能力是由操作系統(tǒng)的提供的,每一種編程語言都會把操作系統(tǒng)提供的低級C接口封裝起來供開發(fā)者使用,Python也不例外。
文件讀寫就是一種常見的IO操作。那么根據(jù)上面的描述,可以推斷python也應(yīng)該封裝操作系統(tǒng)的底層接口,直接提供了文件讀寫相關(guān)的操作方法。事實上,也確實如此,而且Java、PHP等其他語言也是。
那么我們要操作的對象是什么呢?我們又如何獲取要操作的對象呢?
由于操作I/O的能力是由操作系統(tǒng)提供的,且現(xiàn)代操作系統(tǒng)不允許普通程序直接操作磁盤,所以讀寫文件時需要請求操作系統(tǒng)打開一個對象(通常被稱為文件描述符--file descriptor, 簡稱fd),這就是我們在程序中要操作的文件對象。
通常高級編程語言中會提供一個內(nèi)置的函數(shù),通過接收"文件路徑"以及“文件打開模式”等參數(shù)來打開一個文件對象,并返回該文件對象的文件描述符。因此通過這個函數(shù)我們就可以獲取要操作的文件對象了。這個內(nèi)置函數(shù)在Python中叫open(), 在PHP中叫fopen(),
不同的編程語言讀寫文件的操作步驟大體都是一樣的,都分為以下幾個步驟:
1)打開文件,獲取文件描述符2)操作文件描述符--讀/寫3)關(guān)閉文件
只是不同的編程語言提供的讀寫文件的api是不一樣的,有些提供的功能比較豐富,有些比較簡陋。
需要注意的是:文件讀寫操作完成后,應(yīng)該及時關(guān)閉。一方面,文件對象會占用操作系統(tǒng)的資源;另外一方面,操作系統(tǒng)對同一時間能打開的文件描述符的數(shù)量是有限制的,在Linux操作系統(tǒng)上可以通過ulimit -n
來查看這個顯示數(shù)量。如果不及時關(guān)閉文件,還可能會造成數(shù)據(jù)丟失。因為我將數(shù)據(jù)寫入文件時,操作系統(tǒng)不會立刻把數(shù)據(jù)寫入磁盤,而是先把數(shù)據(jù)放到內(nèi)存緩沖區(qū)異步寫入磁盤。當(dāng)調(diào)用close方法時,操作系統(tǒng)會保證把沒有寫入磁盤的數(shù)據(jù)全部寫到磁盤上,否則可能會丟失數(shù)據(jù)。
我們先來看下在Python、PHP和C語言中打開文件的函數(shù)定義
# Python2open(name[, mode[, buffering]])# Python3open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
int open(const char * pathname, int flags);
會發(fā)現(xiàn)以上3種編程語言內(nèi)置的打開文件的方法接收的參數(shù)中,除了都包含一個“文件路徑名稱”,還會包含一個mode參數(shù)(C語言的open函數(shù)中的flags參數(shù)作用相似)。這么mode參數(shù)定義的是打開文件時的模式,常見的文件打開模式有:只讀、只寫、可讀可寫、只追加。不同的編程語言中對文件打開模式的定義有些微小的差別,我們來看下Python中的文件打開模式有哪些。
文件打開模式 | 描述 |
---|---|
r | 以只讀模式打開文件,并將文件指針指向文件頭;如果文件不存在會報錯 |
w | 以只寫模式打開文件,并將文件指針指向文件頭;如果文件存在則將其內(nèi)容清空,如果文件不存在則創(chuàng)建 |
a | 以只追加可寫模式打開文件,并將文件指針指向文件尾部;如果文件不存在則創(chuàng)建 |
r+ | 在r的基礎(chǔ)上增加了可寫功能 |
w+ | 在w的基礎(chǔ)上增加了可讀功能 |
a+ | 在a的基礎(chǔ)上增加了可讀功能 |
b | 讀寫二進(jìn)制文件(默認(rèn)是t,表示文本),需要與上面幾種模式搭配使用,如ab,wb, ab, ab+(POSIX系統(tǒng),包括Linux都會忽略該字符) |
思考1:r+、w+和a+都可以實現(xiàn)對文件的讀寫,那么他們有什么區(qū)別呢?
r+會覆蓋當(dāng)前文件指針?biāo)谖恢玫淖址?,如原來文件?nèi)容是"Hello,World",打開文件后寫入"hi"則文件內(nèi)容會變成"hillo, World"
w+與r+的不同是,w+在打開文件時就會先將文件內(nèi)容清空,不知道它有什么用
a+與r+的不同是,a+只能寫到文件末尾(無論當(dāng)前文件指針在哪里)
思考2:為什么要定義這些模式呢?為什么不能像我們用word打開一篇文檔一樣既可以讀,又可以寫,還可修改呢?
關(guān)于這個問題,我查了很多資料,也沒找到很權(quán)威的說明。在跟同行朋友交流過程中,發(fā)現(xiàn)大家主要有兩種觀點:
跟安全有關(guān),有這種觀點的大部分是做運維的朋友,他們認(rèn)為這就像linux上的rwx(讀、寫、執(zhí)行)權(quán)限。
跟操作系統(tǒng)內(nèi)核管理I/O的機(jī)制有關(guān),有這種觀點的大部分是做C開發(fā)的,特別是與內(nèi)核相關(guān)的開發(fā)人員。為了提高讀寫速度,要寫入磁盤的數(shù)據(jù)會先放進(jìn)內(nèi)存緩沖區(qū),之后再回寫。由于可能會同時打開很多文件,當(dāng)要回寫數(shù)據(jù)時,需要遍歷以打開的文件判斷是否需要回寫。他們認(rèn)為如果打開文件時指定了讀寫模式,那么需要回寫時,只要去查找以“可寫模式”打開的文件就可以了。
我們來讀取這樣一個文本文件:song.txt,該文件的字符編碼為utf-8。
匆匆那年我們 究竟說了幾遍 再見之后再拖延 可惜誰有沒有 愛過不是一場 七情上面的雄辯 匆匆那年我們 一時匆忙撂下 難以承受的諾言 只有等別人兌現(xiàn)
Python3實現(xiàn):
# 第一步:(以只讀模式)打開文件f = open('song.txt', 'r', encoding='utf-8')# 第二步:讀取文件內(nèi)容print(f.read())# 第三步:關(guān)閉文件f.close()
這里說下Python2的實現(xiàn)
# 第一步:(以只讀模式)打開文件f = open('song.txt', 'r')# 第二步:讀取文件內(nèi)容print(f.read().decode('utf-8'))# 第三步:關(guān)閉文件f.close()
說明:
Python3中已經(jīng)內(nèi)置對Unicode的支持,字符串str已經(jīng)是真正的Unicode字符串。也就是說Python3中的文件讀取方法已經(jīng)自動完成了解碼處理,因此無需再手動進(jìn)行解碼,可以直接將讀取的文件中的內(nèi)容進(jìn)行打?。籔ython2中的字符串str是字節(jié)串,讀取文件得到的也是字節(jié)串,在打印之前應(yīng)該手動將其解碼成Unicode字符串。關(guān)于這部分的說明,可以參考之前這篇文章<<再談Python中的字符串與字符編碼>>。
在實現(xiàn)基本功能的前提下,考慮一些可能的意外因素。因為文件讀寫時都有可能產(chǎn)生IO錯誤(IOError),一旦出錯,后面包括f.close()在內(nèi)的所有代碼都不會執(zhí)行了。因此我們要保證文件無論如何都能被關(guān)閉。那么可以用try...finally來實現(xiàn),這實際上就是try...except..finally的簡化版(我們只用Python3來進(jìn)行示例演示):
f = ''try: f = open('song.txt', 'r', encoding='utf-8') print(f.read()) num = 10 / 0finally: print('>>>>>>finally') if f: f.close()
輸出結(jié)果:
匆匆那年我們 究竟說了幾遍 再見之后再拖延 可惜誰有沒有 愛過不是一場 七情上面的雄辯 匆匆那年我們 一時匆忙撂下 難以承受的諾言 只有等別人兌現(xiàn)>>>>>>finally Traceback (most recent call last): File "", line 4, in ZeroDivisionError: division by zero
輸出結(jié)果說明,盡管with代碼塊中出現(xiàn)了異常,但是”>>>>>>finally“ 信息還是被打印了,說明finally代碼塊被執(zhí)行,即文件關(guān)閉操作被執(zhí)行。但是結(jié)果中錯誤信息還是被輸出了,因此還是建議用一個完成的try...except...finally語句對異常信息進(jìn)行捕獲和處理。
為了避免忘記或者為了避免每次都要手動關(guān)閉文件,我們可以使用with語句(一種語法糖,語法糖語句通常是為了簡化某些操作而設(shè)計的)。with語句會在其代碼塊執(zhí)行完畢之后自動關(guān)閉文件。因此我們可以這樣來改寫上面的程序:
with open('song.txt', 'r', encoding='utf-8') as f: print(f.read())print(f.closed)
輸出結(jié)果:
匆匆那年我們 究竟說了幾遍 再見之后再拖延可惜誰有沒有 愛過不是一場 七情上面的雄辯匆匆那年我們 一時匆忙撂下 難以承受的諾言只有等別人兌現(xiàn)True
是不是變得簡介多了,代碼結(jié)構(gòu)也比較清晰了。with之后打印的f.closed屬性值為True,說明文件確實被關(guān)閉了。
思考:
with語句會幫我們自動處理異常信息嗎?
要回答這個問題就要提到“上下文管理器” 和 with語句的工作流程。
with語句不僅僅可以用于文件操作,它實際上是一個很通用的結(jié)構(gòu),允許使用所謂的上下文管理器(context manager)。上下文管理器是一種支持__enter__()和__exit__()這兩個方法的對象。__enter__()方法不帶任何參數(shù),它在進(jìn)入with語句塊的時候被調(diào)用,該方法的返回值會被賦值給as關(guān)鍵字之后的變量。__exit__()方法帶有3個參數(shù):type(異常類型), value(異常信息), trace(異常棧),當(dāng)with語句的代碼塊執(zhí)行完畢或執(zhí)行過程中因為異常而被終止都會調(diào)用__exit__()方法。正常退出時該方法的3個參數(shù)都為None,異常退出時該方法的3個參數(shù)會被分別賦值。如果__exit__()方法返回值(真值測試結(jié)果)為True則表示異常已經(jīng)被處理,命令執(zhí)行結(jié)果中就不會拋出異常信息了;反之,如果__exit__()方法返回值(真值測試結(jié)果)為False,則表示異常沒有被處理并且會向外拋出該異常。
現(xiàn)在我們應(yīng)該明白了,異常信息會不會被處理是由with后的語句返回對象的__exit__()方法決定的。文件可以被用作上下文管理器。它的__enter__方法返回文件對象本身,__exit__方法會關(guān)閉文件并返回None。我們看下file類中關(guān)于這兩個方法的實現(xiàn):
def __enter__(self): # real signature unknown; restored from __doc__ """ __enter__() -> self. """ return self def __exit__(self, *excinfo): # real signature unknown; restored from __doc__ """ __exit__(*excinfo) -> None. Closes the file. """ pass
可見,file類的__exit__()方法的返回值為None,None的真值測試結(jié)果為False,因此用于文件讀寫的with語句代碼塊中的異常信息還是會被拋出來,需要我們自己去捕獲并處理。
with open('song.txt', 'r', encoding='utf-8') as f: print(f.read()) num = 10 / 0
輸出結(jié)果:
匆匆那年我們 究竟說了幾遍 再見之后再拖延 可惜誰有沒有 愛過不是一場 七情上面的雄辯 匆匆那年我們 一時匆忙撂下 難以承受的諾言 只有等別人兌現(xiàn) Traceback (most recent call last): File "", line 3, in ZeroDivisionError: division by zero
注意:上面所說的__exit__()方法返回值(真值測試結(jié)果)為True則表示異常已經(jīng)被處理,指的是with代碼塊中出現(xiàn)的異常。它對于with關(guān)鍵字之后的代碼中出現(xiàn)的異常是不起作用的,因為還沒有進(jìn)入上下文管理器就已經(jīng)發(fā)生異常了。因此,無論如何,還是建議在必要的時候在with語句外面套上一層try...except來捕獲和處理異常。
有關(guān)“上下文管理器”這個強(qiáng)大且高級的特性的更多信息,請參看Python參考手冊中的上下文管理器部分?;蛘呖梢栽赑ython庫參考中查看上下文管理器和contextlib部分。
我們知道,對文件的讀取操作需要將文件中的數(shù)據(jù)加載到內(nèi)存中,而上面所用到的read()方法會一次性把文件中所有的內(nèi)容全部加載到內(nèi)存中。這明顯是不合理的,當(dāng)遇到一個幾個G的的文件時,必然會耗光機(jī)器的內(nèi)存。這里我們來介紹下Python中讀取文件的相關(guān)方法:
方法 | 描述 |
---|---|
read() | 一次讀取文件所有內(nèi)容,返回一個str |
read(size) | 每次最多讀取指定長度的內(nèi)容,返回一個str;在Python2中size指定的是字節(jié)長度,在Python3中size指定的是字符長度 |
readlines() | 一次讀取文件所有內(nèi)容,按行返回一個list |
readline() | 每次只讀取一行內(nèi)容 |
此外,還要兩個與文件指針位置相關(guān)的方法
方法 | 描述 |
---|---|
seek(n) | 將文件指針移動到指定字節(jié)的位置 |
tell() | 獲取當(dāng)前文件指針?biāo)谧止?jié)位置 |
下面來看下操作實例
with open('song.txt', 'r') as f: print(f.read(12).decode('utf-8'))
輸出結(jié)果:
匆匆那年
結(jié)果說明:Python2中read(size)方法的size參數(shù)指定的要讀取的字節(jié)數(shù),而song.txt文件是UTF-8編碼的內(nèi)容,一個漢字占3個字節(jié),因此12個字節(jié)剛好是4個漢字。
with open('song.txt', 'r', encoding='utf-8') as f: print(f.read(12))
輸出結(jié)果:
匆匆那年我們 究竟說
結(jié)果說明:Python3中read(size)方法的size參數(shù)指定的要讀取的字符數(shù),這與文件的字符編碼無關(guān),就是返回12個字符。
with open('song.txt', 'r', encoding='utf-8') as f: print(f.readline())
with open('song.txt', 'r') as f: print(f.readline().decode('utf-8'))
輸出結(jié)果都一樣:
匆匆那年我們 究竟說了幾遍 再見之后再拖延
這里我們只以Python3來進(jìn)行實例操作,Python2僅僅是需要在讀取到內(nèi)容后進(jìn)行手動解碼而已,上面已經(jīng)有示例。
with open('song.txt', 'r', encoding='utf-8') as f: for line in f.readlines(): print(line)
輸出結(jié)果:
匆匆那年我們 究竟說了幾遍 再見之后再拖延 可惜誰有沒有 愛過不是一場 七情上面的雄辯 匆匆那年我們 一時匆忙撂下 難以承受的諾言 只有等別人兌現(xiàn)
這種方式的缺點與read()方法是一樣的,都是會消耗大量的內(nèi)存空間。
with open('song.txt', 'r', encoding='utf-8', newline='') as f: for line in f: print(line)
輸出結(jié)果:
匆匆那年我們 究竟說了幾遍 再見之后再拖延 可惜誰有沒有 愛過不是一場 七情上面的雄辯 匆匆那年我們 一時匆忙撂下 難以承受的諾言 只有等別人兌現(xiàn)
另外,發(fā)現(xiàn)上面的輸出結(jié)果中行與行之間多了一個空行。這是因為文件每一行的默認(rèn)都有換行符,而print()方法也會輸出換行,因此就多了一個空行。去掉空行也比較簡單:可以用line.rstrip()
去除字符串右邊的換行符,也可以通過print(line, end='')避免print方法造成的換行。
file類的其他方法:
方法 | 描述 |
---|---|
flush() | 刷新緩沖區(qū)數(shù)據(jù),將緩沖區(qū)中的數(shù)據(jù)立刻寫入文件 |
next() | 返回文件下一行,這個方法也是file對象實例可以被當(dāng)做迭代器使用的原因 |
truncate([size]) | 截取文件中指定字節(jié)數(shù)的內(nèi)容,并覆蓋保存到文件中,如果不指定size參數(shù)則文件將被清空; Python2無返回值,Python3返回新文件的內(nèi)容字節(jié)數(shù) |
write(str) | 將字符串寫入文件,沒有返回值 |
writelines(sequence) | 向文件寫入一個字符串或一個字符串列表,如果字符串列表中的元素需要換行要自己加入換行符 |
fileno() | 返回一個整型的文件描述符,可以用于一些底層IO操作上(如,os模塊的read方法) |
isatty() | 判斷文件是否被連接到一個虛擬終端,是則返回True,否則返回False |
前面已經(jīng)寫過一篇介紹Python中字符編碼的相關(guān)文件<<再談Python中的字符串與字符編碼>> 里面花了很大的篇幅介紹Python中字符串與字符編碼的關(guān)系以及轉(zhuǎn)換過程。其中談到過兩個指定的字符編碼的地方,及其作用:
PyCharm等IDE開發(fā)工具指定的項目工程和文件的字符編碼:它的主要作用是告訴Pycharm等IDE開發(fā)工具保存文件時應(yīng)該將字符轉(zhuǎn)換為怎樣的字節(jié)表示形式,以及打開并展示文件內(nèi)容時應(yīng)該以什么字符編碼將字節(jié)碼轉(zhuǎn)換為人類可識別的字符。
Python源代碼文件頭部指定的字符編碼,如*-* coding:utf-8 -*-
:它的主要作用是告訴Python解釋器當(dāng)前python代碼文件保存時所使用的字符編碼,Python解釋器在執(zhí)行代碼之前,需要先從磁盤讀取該代碼文件中的字節(jié)然后通過這里指定的字符編碼將其解碼為unicode字符。Python解釋器執(zhí)行Python代碼的過程與IDE開發(fā)工具是沒有什么關(guān)聯(lián)性的。
那么這里為什么又要談起字符編碼的問題呢?
或者換個問法,既然從上面已經(jīng)指定了字符編碼,為什么對文件進(jìn)行讀寫時還要指定字符編碼呢?從前面的描述可以看出:上面兩個地方指定的是Python代碼文件的字符編碼,是給Python解釋器和Pycharm等程序軟件用的;而被讀寫文件的字符編碼與Python代碼文件的字符編碼沒有必然聯(lián)系,讀寫文件時指定的字符編碼是給我們寫的程序軟件用的。這是不同的主體和過程,希望我說明白了。
讀寫文件時怎樣指定字符編碼呢?
上面解釋了讀寫文件為什么要指定字符編碼,這里要說下怎樣指定字符編碼(其實這里主要討論是讀取外部數(shù)據(jù)時的情形)。這個問題其實在上面的文件讀取示例中已經(jīng)使用過了,這里我們再詳細(xì)的說一下。
首先,再次看一下Python2和Python3中open函數(shù)的定義:
# Python2open(name[, mode[, buffering]])# Python3open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
可以看到,Python3的open函數(shù)中多了幾個參數(shù),其中包括一個encoding參數(shù)。是的,這個encoding就是用來指定被操作文件的字符編碼的。
# 讀操作with open('song.txt', 'r', encoding='utf-8') as f: print(f.read())# 寫操作with open('song.txt', 'w', encoding='utf-8') as f: print(f.write('你好'))
那么Python2中怎樣指定呢?Python2中的對文件的read和write操作都是字節(jié),也就說Python2中文件的read相關(guān)方法讀取的是字節(jié)串(如果包含中文字符,會發(fā)現(xiàn)len()方法的結(jié)果不等于讀取到的字符個數(shù),而是字節(jié)數(shù))。如果我們要得到 正確的字符串,需要手動將讀取到的結(jié)果decode(解碼)為字符串;相反,要以特定的字符編碼保存要寫入的數(shù)據(jù)時,需要手動encode(編碼)為字節(jié)串。這個encode()和decode()函數(shù)可以接收一個字符編碼參數(shù)。Python3中read和write操作的都是字符串,實際上是Python解釋器幫我們自動完成了寫入時的encode(編碼)和讀取時的decode(解碼)操作,因此我們只需要在打開文件(open函數(shù))時指定字符編碼就可以了。
# 讀操作with open('song.txt', 'r') as f: print(f.read().decode('utf-8')) # 寫操作with open('song2.txt', 'w') as f: # f.write(u'你好'.encode('utf-8')) # f.write('你好'.decode('utf-8').encode('utf-8')) f.write('你好')
Python3中open函數(shù)的encoding參數(shù)顯然是可以不指定的,這時候就會用一個“默認(rèn)字符編碼”。
看下Python3中open函數(shù)文檔對encoding參數(shù)的說明:
encoding is the name of the encoding used to decode or encode thefile. This should only be used in text mode. The default encoding isplatform dependent, but any encoding supported by Python can be passed. See the codecs module for the list of supported encodings.
也就是說,encoding參數(shù)的默認(rèn)值是與平臺有關(guān)的,比如Window上默認(rèn)字符編碼為GBK,Linux上默認(rèn)字符編碼為UTF-8。
而對于Python2來說,在進(jìn)行文件寫操作時,字節(jié)會被直接保存;在進(jìn)行文件讀操作時,如果不手動進(jìn)行來decode操作自然也就用不著默認(rèn)字符編碼了。但是這時候在不同的字符終端打印的時候,會用當(dāng)前平臺的字符編碼自動將字節(jié)解碼為字符,此時可能會出現(xiàn)亂碼。如song.txt文件時UTF-8編碼的,在windows(字符編碼為GBK)的命令行終端進(jìn)行如下操作就會出現(xiàn)亂碼:
>>> with open('song.txt', 'r') as f: ... print(f.read()) ... 鍖嗗寙閭e勾鎴戜滑 絀剁珶璇翠簡鍑犻亶 鍐嶈涔嬪悗鍐嶆嫋寤? 鍙儨璋佹湁娌℃湁 鐖辮繃涓嶆槸涓€鍦?涓冩儏涓婇潰鐨勯泟杈? 鍖嗗寙閭e勾鎴戜滑 涓€鏃跺寙蹇欐拏涓?闅句互鎵垮彈鐨勮璦€ 鍙湁絳夊埆浜哄厬鐜
我們應(yīng)該盡可能的獲取被操作文件的字符編碼,并明確指定encoding參數(shù)的值。
感謝各位的閱讀!關(guān)于python讀寫文件操作的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!