IO編程中,Stream(流)是一個很重要的概念,可以把流想象成一個水管,數據就是水管里的水,但是只能單向流動。Input Stream就是數據從外面(磁盤、網絡)流進內存,Output Stream就是數據從內存流到外面去。對于瀏覽網頁來說,瀏覽器和新浪服務器之間至少需要建立兩根水管,才可以既能發數據,又能收數據。
StringIO
很多時候,數據讀寫不一定是文件,也可以在內存中讀寫。
StringIO顧名思義就是在內存中讀寫str。
要把str寫入StringIO,我們需要先創建一個StringIO,然后,像文件一樣寫入即可:
from io import StringIO
f = StringIO()
f.write('hello')
5
f.write(' ')
1
f.write('world!')
6
print(f.getvalue())
hello world!
getvalue()方法用于獲得寫入后的str。
要讀取StringIO,可以用一個str初始化StringIO,然后,像讀文件一樣讀取:
from io import StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
... s = f.readline()
... if s == '':
... break
... print(s.strip())
...
Hello!
Hi!
Goodbye!
BytesIO
StringIO操作的只能是str,如果要操作二進制數據,就需要使用BytesIO。
BytesIO實現了在內存中讀寫bytes,我們創建一個BytesIO,然后寫入一些bytes:
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
6
print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
請注意,寫入的不是str,而是經過UTF-8編碼的bytes。
和StringIO類似,可以用一個bytes初始化BytesIO,然后,像讀文件一樣讀取:
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()
b'\xe4\xb8\xad\xe6\x96\x87’
操作文件和目錄
操作文件和目錄的函數一部分放在os模塊中,一部分放在os.path模塊中,這一點要注意一下。查看、創建和刪除目錄可以這么調用:
查看當前目錄的絕對路徑:
os.path.abspath('.')
'/Users/michael'
在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來:
os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
然后創建一個目錄:
os.mkdir('/Users/michael/testdir')
刪掉一個目錄:
os.rmdir('/Users/michael/testdir')