1. 程式人生 > >廖雪峰python3複習總結——day9-2

廖雪峰python3複習總結——day9-2

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'