廖雪峰python3複習總結——day9-2
阿新 • • 發佈:2018-12-11
IO程式設計:分為同步IO和非同步IO.
讀檔案:
>>> f = open('/Users/michael/test.txt', 'r')
開啟後要關閉檔案:“r”為UTF-8編碼的文字檔案,要讀取二進位制檔案,比如圖片、視訊等等,用'rb'
模式開啟檔案即可。
要讀取非UTF-8編碼的文字檔案,需要給open()
函式傳入encoding
引數
try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close() 簡潔版本: with open('/path/to/file', 'r') as f: print(f.read()) 非UTF-8檔案: >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk') >>> f.read() '測試' 忽略非法編碼字元 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
呼叫read()會一次性讀取檔案的全部內容,如果檔案有10G,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)方法,每次最多讀取size個位元組的內容。另外,呼叫readline()可以每次讀取一行內容,呼叫readlines()一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼呼叫。
寫檔案:
寫檔案和讀檔案是一樣的,唯一區別是呼叫open()
函式時,傳入識別符號'w'
或者'wb'
表示寫文字檔案或寫二進位制檔案。
你可以反覆呼叫write()
來寫入檔案,但是務必要呼叫f.close()
來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()
close()
的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。
以'w'
模式寫入檔案時,如果檔案已存在,會直接覆蓋(相當於刪掉後新寫入一個檔案)。如果我們希望追加到檔案末尾怎麼辦?可以傳入'a'
以追加(append)模式寫入。
with open('E:\ce.txt', 'a') as f:
f.write('Hello, world!')
StringIO和BytesIO:StringIO操作的只能是str,如果要操作二進位制資料,就需要使用BytesIO。
>>> from io import StringIO >>> f = StringIO() >>> f.write('hello') 5 >>> f.write(' ') 1 >>> f.write('world!') 6 >>> print(f.getvalue()) hello world! >>> from io import StringIO >>> f = StringIO('Hello!\nHi!\nGoodbye!') >>> while True: ... s = f.readline() ... if s == '': ... break ... print(s.strip()) ... Hello! Hi! Goodbye >>> from io import BytesIO >>> f = BytesIO() >>> f.write('中文'.encode('utf-8')) 6 >>> print(f.getvalue()) b'\xe4\xb8\xad\xe6\x96\x87' >>> from io import BytesIO >>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') >>> f.read() b'\xe4\xb8\xad\xe6\x96\x87'