python文件读取下一个字符_python文件的读写总结
讀寫文件是最常見的IO操作。Python內(nèi)置了讀寫文件的函數(shù),用法和C是兼容的。
讀寫文件前,我們先必須了解一下,在磁盤上讀寫文件的功能都是由操作系統(tǒng)提供的,現(xiàn)代操作系統(tǒng)不允許普通的程序直接操作磁盤,所以,讀寫文件就是請求操作系統(tǒng)打開一個文件對象(通常稱為文件描述符),然后,通過操作系統(tǒng)提供的接口從這個文件對象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫入這個文件對象(寫文件)。
python 文件操作記住1個函數(shù)3個方法:(python中一切皆為對象)
open():請求打開文件:
如果文件存在返回文件的操作對象,
如果文件不存在,會拋出異常
關(guān)于open()的mode參數(shù):
'r':讀
'w':寫
'a':追加
'r+' == r+w(可讀可寫,文件若不存在就報錯(IOError))
'w+' == w+r(可讀可寫,文件若不存在就創(chuàng)建)
'a+' ==a+r(可追加可寫,文件若不存在就創(chuàng)建)
對應(yīng)的,如果是二進(jìn)制文件,就都加一個b就好啦:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
read方法——讀取文件,將文件讀取到內(nèi)存中,可以一次性讀取文件所有內(nèi)容
write方法——將文件內(nèi)容寫入到文件
close方法——關(guān)閉文件
準(zhǔn)備文檔
往事隨風(fēng) -齊秦
詞:許常德
曲:涂惠元
你的影子無所不在
人的心事像一顆塵埃
落在過去 飄向未來
掉進(jìn)眼里就流出淚來
曾經(jīng)滄海無限感慨
有時孤獨(dú)比擁抱實(shí)在
讓心春去 讓夢秋來
讓你離開
舍不得忘
一切都是為愛
沒有遺憾 還有我
就讓往事隨風(fēng) 都隨風(fēng) 都隨風(fēng) 心隨你動
昨天花謝花開 不是夢 不是夢 不是夢
一、讀文件
1、打開文件
要以讀文件的模式打開一個文件對象,使用Python內(nèi)置的open()函數(shù),傳入文件名和標(biāo)示符.
首先,我們看下open函數(shù)的定義:
1 def open(file: Union[str, bytes, int], mode: str = ..., buffering: int = ..., encoding: Optional[str] = ..., errors: Optional[str] = ..., newline: Optional[str] = ..., closefd: bool = ...) Inferred type: (file: Union[str, bytes, int], mode: str, buffering: int, encoding: Optional[str], errors: Optional[str], newline: Optional[str], closefd: bool) -> IO Open file and return a stream. Raise IOError upon failure.
在一般情況下,我們打開文件只需要傳入文件路徑即可,這里我們讀取的文件的內(nèi)容是中文,為了避免亂碼,我們在這里指定了編碼格式。其他的參數(shù)等我們用到的時候,在仔細(xì)說明。open函數(shù)返回一個表示文件的對象,python會將這個對象存儲在我們的變量f中,這樣我們就可以方便的操作了。
我先在桌面創(chuàng)建一個名叫test.txt的文本文件:
>>> f =open('C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')//以絕對路徑打開文件
File"", line 1SyntaxError: (unicode error)'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
出現(xiàn)這個錯誤的原因是:windows中的路徑是反斜杠\,然而反斜杠\在python中有著轉(zhuǎn)義字符的意義,所以在py文件中寫windows文件路徑的時候,要特別注意反斜杠\的使用。
下面有三種解決方式:
1 >>> f =open('C:\\Users\\24414\\Desktop\\test.txt','r',encoding='utf-8')2 >>>
3 >>> f =open(r'C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')4 >>>
5 >>> f =open('C:/Users/24414/Desktop/test.txt','r',encoding='utf-8')6 >>>
標(biāo)示符'r'表示讀,這樣,我們就成功地打開了一個文件。
如果文件不存在,open()函數(shù)就會拋出一個IOError的錯誤,并且給出錯誤碼和詳細(xì)的信息告訴你文件不存在:
1 >>> f =open('C:\Users\24414\Desktop\test1.txt','r',encoding='utf-8')2 File "", line 1
3 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
4 >>>
2、讀取文件
2.1 讀取整個文件
操作文件的第一步就是得打開要操作的文件,然后進(jìn)行讀取。在python中我們可以使用open函數(shù)來打開一個文件,然后使用read方法來讀取文件。
示例1,data.txt和我們的文件在同一目錄下,所以直接使用名稱即可::
如果是其他路徑(非程序目錄),那么直接使用絕對路徑:
我是在window的開發(fā)環(huán)境,以windows為例,我們在桌面有一個data1.txt文件:我們在將文件打開后,打印一下這個f到底有些什么:
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')>>>f.read()'往事隨風(fēng) - 齊秦\n詞:許常德\n曲:涂惠元\n你的影子無所不在\n人的心事像一顆塵埃\n落在過去 飄向未來\n掉進(jìn)眼里就流出淚來\n 曾經(jīng)滄海無限感慨\n有時孤獨(dú)比擁抱實(shí)在\n讓心春去 讓夢秋來\n讓你離開\n舍不得忘\n一切都是為愛\n沒有遺憾 還有我\n就讓往事隨風(fēng) 都隨風(fēng) 都隨風(fēng) 心隨你動\n昨天花謝花開 不是夢 不是夢 不是夢'
>>>
print(dir(f))
輸出:
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
>>>
這些都是和文件操作相關(guān)的,在這里不會給大家做仔細(xì)說明,只是讓大家對這些東西有個印象,等遇到了,我們在說怎么使用。
2.2 逐行讀取
上面是讀取整個文件內(nèi)容,接下來我們看下怎么逐行讀取文件。
在逐行讀取文本的時候,常見的可以使用for循環(huán)來讀取:
2.2.1 read()
read:如果指定了參數(shù) size,就按照該指定長度從文件中讀取內(nèi)容,否則,就讀取全文。被讀出來的內(nèi)容,全部塞到一個字符串里面。這樣有好處,就是東西都到內(nèi)存里面了,隨時取用;但如果文件內(nèi)容太多了,內(nèi)存會吃不消。注意換行符也為占用一個內(nèi)存,缺點(diǎn)需要知道光標(biāo)的位置,以及每一行的大小SIZE。
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')>>> f.read(10)'往事隨風(fēng) - 齊秦\n'
>>> f.read(5)'詞:許常德'
>>>
2.2.2 readline()
概述:readline() 方法用于從文件讀取整行,包括 "\n" 字符。從字面意思可以看出,該方法每次讀出一行內(nèi)容。所以,讀取時占用內(nèi)存小,比較適合大文件,該方法返回一個字符串對象。如果指定了一個非負(fù)數(shù)的參數(shù),則返回指定大小的字節(jié)數(shù),包括 "\n" 字符。
語法
fileObject.readline();
參數(shù)
size -- 從文件中讀取的字節(jié)數(shù)。
返回值
返回從字符串中讀取的字節(jié)。
1 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')2 >>> whileTrue:3 ... line=f.read()4 ... if not line:#到 EOF,返回空字符串,則終止循環(huán)
5 ... break
6 ... print(line)7 ...8 往事隨風(fēng) -齊秦9 詞:許常德10 曲:涂惠元11 你的影子無所不在12 人的心事像一顆塵埃13 落在過去 飄向未來14 掉進(jìn)眼里就流出淚來15 曾經(jīng)滄海無限感慨16 有時孤獨(dú)比擁抱實(shí)在17 讓心春去 讓夢秋來18 讓你離開19 舍不得忘20 一切都是為愛21 沒有遺憾 還有我22 就讓往事隨風(fēng) 都隨風(fēng) 都隨風(fēng) 心隨你動23 昨天花謝花開 不是夢 不是夢 不是夢24 >>>
2.2.3 readlines()
概述:readlines() 方法用于讀取所有行(直到結(jié)束符 EOF)并返回列表,該列表可以由 Python 的 for... in ... 結(jié)構(gòu)進(jìn)行處理。當(dāng)文件太大時,內(nèi)存可能不夠用。 如果碰到結(jié)束符 EOF 則返回空字符串。
如果碰到結(jié)束符 EOF 則返回空字符串。
語法
readlines() 方法語法如下:
fileObject.readlines( );
參數(shù)
無。
返回值
返回列表,包含所有的行。
1 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')2 >>> print(f.readlines())3 ['往事隨風(fēng) - 齊秦\n', '詞:許常德\n', '曲:涂惠元\n', '你的影子無所不在\n', '人的心事像一顆塵埃\n', '落在過去 飄向未來\n', '掉進(jìn)眼里就流出淚來\n', '曾經(jīng)滄海無限感慨\n', '有時孤獨(dú)比擁抱實(shí)在\n', '讓心春去 讓夢秋來\n', '讓你離開\n', '舍不得忘\n', '一切都是為愛\n', '沒有遺憾 還有我\n', '就讓往事隨風(fēng) 都隨風(fēng) 都隨風(fēng) 心隨你動\n', '昨天花謝花開 不是夢 不是夢 不是夢']4 >>> for line inf.readlines():5 ... print(line)6 ...7 >>>
8 >>>
9 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')10 >>> for line inf.readlines():11 ... print(line)12 ...13 往事隨風(fēng) -齊秦14
15 詞:許常德16
17 曲:涂惠元18
19 你的影子無所不在20
21 人的心事像一顆塵埃22
23 落在過去 飄向未來24
25 掉進(jìn)眼里就流出淚來26
27 曾經(jīng)滄海無限感慨28
29 有時孤獨(dú)比擁抱實(shí)在30
31 讓心春去 讓夢秋來32
33 讓你離開34
35 舍不得忘36
37 一切都是為愛38
39 沒有遺憾 還有我40
41 就讓往事隨風(fēng) 都隨風(fēng) 都隨風(fēng) 心隨你動42
43 昨天花謝花開 不是夢 不是夢 不是夢44 >>>
2.3 讀取大文件
如果文件太大,就不能用 read() 或者 readlines() 一次性將全部內(nèi)容讀入內(nèi)存。
方法一、可以使用 while 循環(huán)和 readline() 來完成這個任務(wù)。
這里不再舉例
方法二、使用 fileinput 模塊:
1 >>> importfileinput2 >>> for line in fileinput.input(r'C:\Users\24414\Desktop\data1.txt'):3 ... print(line)4 ...5 往事隨風(fēng) -齊秦6
7 詞:許常德8
9 曲:涂惠元10
11 你的影子無所不在12
13 人的心事像一顆塵埃14 ......
第三種方法,直接讀取文件句柄,推薦使用這種方法
1 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')2 >>>f3 <_io.TextIOWrapper name='C:\\Users\\24414\\Desktop\\data1.txt' mode='r' encoding='gbk'>
4 >>> for line inf:5 ... print(line)6 ...7 往事隨風(fēng) -齊秦8
9 詞:許常德10
11 曲:涂惠元12
13 你的影子無所不在14
15 人的心事像一顆塵埃
之所以能夠如此,是因?yàn)?file 是可迭代的數(shù)據(jù)類型,直接用 for 來迭代即可
3、 關(guān)閉文件
最后一步是調(diào)用close()方法關(guān)閉文件。文件使用完畢后必須關(guān)閉,因?yàn)槲募ο髸加貌僮飨到y(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的:
1 f.close()
每次都要使用完都要關(guān)閉文件,很容易忘記,而且每次都這么寫實(shí)在太繁瑣,所以,Python引入了with語句來自動幫我們調(diào)用close()方法:
1 >>> with open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk') as f:2 ... for line inf:3 ... print(line.strip())4 ...5 往事隨風(fēng) -齊秦6 詞:許常德7 曲:涂惠元8 你的影子無所不在9 人的心事像一顆塵埃10 落在過去 飄向未來11 掉進(jìn)眼里就流出淚來12 曾經(jīng)滄海無限感慨
注意:
file-like Object
像open()函數(shù)返回的這種有個read()方法的對象,在Python中統(tǒng)稱為file-like Object。除了file外,還可以是內(nèi)存的字節(jié)流,網(wǎng)絡(luò)流,自定義流等等。file-like Object不要求從特定類繼承,只要寫個read()方法就行。
StringIO就是在內(nèi)存中創(chuàng)建的file-like Object,常用作臨時緩沖。
二進(jìn)制文件
前面講的默認(rèn)都是讀取文本文件,并且是UTF-8編碼的文本文件。要讀取二進(jìn)制文件,比如圖片、視頻等等,用'rb'模式打開文件即可:
字符編碼
要讀取非UTF-8編碼的文本文件,需要給open()函數(shù)傳入encoding參數(shù),例如,讀取GBK編碼的文件:
1 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')2 >>>f.read()3 '測試'
遇到有些編碼不規(guī)范的文件,你可能會遇到UnicodeDecodeError,因?yàn)樵谖谋疚募锌赡軍A雜了一些非法編碼的字符。遇到這種情況,open()函數(shù)還接收一個errors參數(shù),表示如果遇到編碼錯誤后如何處理。最簡單的方式是直接忽略:
1 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
二、寫文件
寫文件和讀文件是一樣的,唯一區(qū)別是調(diào)用open()函數(shù)時,傳入標(biāo)識符'w'或者'wb'表示寫文本文件或?qū)懚M(jìn)制文件
>>> f = open(r'C:\Users\24414\Desktop\data2.txt', 'w',encoding='gbk')>>> f.write('Hello world!')12
>>>f.flush()
注意:如果指定路徑?jīng)]有data2.txt文件,它會先創(chuàng)建一個文件。
當(dāng)我們寫文件時,操作系統(tǒng)往往不會立刻把數(shù)據(jù)寫入磁盤,而是放到內(nèi)存緩存起來,空閑的時候再慢慢寫入。如果沒有這句代碼f.flush(),內(nèi)容只是被寫到了緩沖區(qū),等緩沖區(qū)滿了,才會將內(nèi)容寫到文件中。有了這句代碼就會直接寫入到文本中,而不會等待緩沖區(qū)滿。當(dāng)然也可以最后,調(diào)用f.close()實(shí)現(xiàn)相同的功能。沒有這一步的后果是數(shù)據(jù)可能只寫了一部分到磁盤,剩下的丟失了。
python文件對象提供了兩個“寫”方法: write() 和 writelines()。
write()方法和read()、readline()方法對應(yīng),是將字符串寫入到文件中。
1 >>> with open(r'C:\Users\24414\Desktop\data2.txt','w',encoding='gbk') as f:2 ... f.write('1\n2\n3\n')3 ...4 6
5 >>>
writelines()方法和readlines()方法對應(yīng),也是針對列表的操作。它接收一個字符串列表作為參數(shù),將他們寫入到文件中,換行符不會自動的加入,因此,需要顯式的加入換行符。
f1 = open(r'C:\Users\24414\Desktop\data2.txt'
, 'w')
f1.writelines(["1", "2", "3"])#此時test1.txt的內(nèi)容為:123 f1= open(
r'C:\Users\24414\Desktop\data2.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])#此時test1.txt的內(nèi)容為:#1#2#3
三、file類的其他方法
3.1 tell()和seek() 注意:這里的位置指的是字節(jié)數(shù),而不是字符個數(shù)
tell()
seek()
概述
返回文件的當(dāng)前位置,即文件指針當(dāng)前位置。
用于移動文件讀取指針到指定位置。
語法
fileObject.tell()
fileObject.seek(offset[, whence])
參數(shù)
無
offset -- 開始的偏移量,也就是代表需要移動偏移的字節(jié)數(shù),如果是負(fù)數(shù)表示從倒數(shù)第幾位開始。
whence:可選,默認(rèn)值為 0。給 offset 定義一個參數(shù),表示要從哪個位置開始偏移;0 代表從文件開頭開始算起,1 代表從當(dāng)前位置開始算起,2 代表從文件末尾算起。
返回值
返回文件的當(dāng)前位置。
如果操作成功,則返回新的文件位置,如果操作失敗,則函數(shù)返回 -1。
1 with open('data', 'r', encoding='utf-8') as f:2 print(f.readline().rstrip())3 print(f.tell())4 print(len('往事隨風(fēng) - 齊秦\n'.encode('utf-8')))5 print(f.read(4))6 print(f.tell())7f.seek(0)8 print(f.readline().rstrip())9 輸出>>>
10 往事隨風(fēng) -齊秦11 23
12 22
13詞:許常14 35
15 往事隨風(fēng) - 齊秦
3.2 File flush()
概述
語法
參數(shù)
返回值
flush() 方法是用來刷新緩沖區(qū)的,即將緩沖區(qū)中的數(shù)據(jù)立刻寫入文件,同時清空緩沖區(qū),不需要是被動的等待輸出緩沖區(qū)寫入。
一般情況下,文件關(guān)閉后會自動刷新緩沖區(qū),但有時你需要在關(guān)閉前刷新它,這時就可以使用 flush() 方法。
fileObject.flush();
無
該方法沒有返回值。
1 importsys,time2 for i in range(50):3 sys.stdout.write('#')4 sys.stdout.flush()5 time.sleep(0.5)6 輸出>>>
7 ##################################################
3.3 next()
概述
語法
參數(shù)
返回值
Python 3 的內(nèi)置函數(shù) next() 通過迭代器調(diào)用 __next__() 方法返回下一項(xiàng)。 在循環(huán)中,next()方法會在每次循環(huán)中調(diào)用,該方法返回文件的下一行,如果到達(dá)結(jié)尾(EOF),則觸發(fā) StopIteration
next(iterator[,default])
無
返回文件下一行。
文檔內(nèi)容:
第一行
第二行
第三行
第四行
第五行
示例:
1 >>> f=open(r'C:\Users\24414\Desktop\data1.txt','r')2 >>> for index in range(5):3 ... line=next(f)4 ... print(index,':',line)5 ...6 0 : 第一行7
8 1: 第二行9
10 2: 第三行11
12 3: 第四行13
14 4: 第五行15 >>>
3.4 truncate()
概述
語法
返回值
參數(shù)
truncate() 方法用于從文件的首行首字節(jié)開始截斷,截斷文件為 size 個字節(jié),無 size 表示從當(dāng)前位置截斷;截斷之后 V 后面的所有字節(jié)被刪除.
fileObject.truncate([size ])
該方法沒有返回值。
size -- 可選,如果存在則文件截斷為 size 字節(jié)。
有坑:根據(jù)上述文檔說明不帶參truncate()函數(shù)會截取文件頭到當(dāng)前游標(biāo)位置的字節(jié)。
但是,當(dāng)文件以文本的形式打開時,進(jìn)行讀操作造成游標(biāo)改變時,文件不會被截取.同樣的操作,當(dāng)文件以二進(jìn)制方式打開時,文件才會被截取.原因還未知
1 f = open("data1", "r+", encoding="utf-8")2 print(f.readline())3 f.truncate()4 f.seek(0)5 print(f.read())6 輸出>>>
7 第一行8
9 第一行10 第二行11 第三行12 第四行13 第五行
1 f = open("data1", "r+", encoding="utf-8")2 print(f.readline())3 f.truncate(10)4 f.seek(0)5 print(f.read())6 輸出>>>
7 第一行8
9 第一行
3.5 不常用的兩個操作
fileno()
返回一個整型的文件描述符,可以用于一些底層IO操作上(如,os模塊的read方法)
isatty()
判斷文件是否被連接到一個虛擬終端,是則返回True,否則返回False
總結(jié)
以上是生活随笔為你收集整理的python文件读取下一个字符_python文件的读写总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超声波测距仪编程_简易超声波测距仪的制作
- 下一篇: 【SQL】格式为yyyymmddhh:m