io:輕鬆地建立緩存

介紹

io模塊是python中專門用來進行流處理的模塊

StringIO

提供字符串形式的緩存,能夠不斷地往裏面寫入數據,最後一次性讀出
import io

# 建立相應的緩存
buf = io.StringIO()

buf.write("我是誰?")
# 寫的內容是鏈接在一塊兒的,不會自動換行,若是想要換行,須要加\n
buf.write("我在哪?\n")
buf.write("誰在打我?")

# 經過getvalue獲取內容
print(buf.getvalue())
"""
我是誰?我在哪?
誰在打我?
"""

BytesIO

既然有StringIO,那麼確定也會有BytesIO,用法是同樣的
import io

# 建立相應的緩存
buf = io.BytesIO()

buf.write(bytes("我是誰?", encoding="utf-8"))
buf.write(bytes("我在哪?\n", encoding="utf-8"))
buf.write(bytes("誰在打我?", encoding="utf-8"))

# 經過getvalue獲取內容
data = buf.getvalue()
print(data)
"""
b'\xe6\x88\x91\xe6\x98\xaf\xe8\xb0\x81\xef\xbc\x9f\xe6\x88\x91\xe5\x9c\xa8\xe5\x93\xaa\xef\xbc\x9f\n\xe8\xb0\x81\xe5\x9c\xa8\xe6\x89\x93\xe6\x88\x91\xef\xbc\x9f'
"""

print(str(data, encoding="utf-8"))
"""
我是誰?我在哪?
誰在打我?
"""

TextIOWrapper

將一個字節流對象包裝成一個文本對象
import io
import gzip


with gzip.open("1.tar.gz", "wb") as out:
    # 我想往裏面寫入文本,那麼須要對其進行一個包裝
    with io.TextIOWrapper(out, encoding="utf-8") as f:
        # 這裏的f和咱們使用open函數獲得的f是相似的
        f.write("我要寫入文件了")


# 讀取文件
with gzip.open("1.tar.gz", "rb") as out:
    with io.TextIOWrapper(out, encoding="utf-8") as f:
        print(f.read())  # 我要寫入文件了

import os
os.remove("1.tar.gz")

固然這裏換成open也是能夠的,主要就是對字節流的文本對象進行一個包裝,從而能夠寫入字符串。記住若是要想使用io.TextIOWrapper進行包裝的話,那麼打開的方式必定要是二進制的方式python

import io
import gzip


with open("1.png", "wb") as out:
    with io.TextIOWrapper(out, encoding="utf-8") as f:
        f.write("這是一張圖片")


# 讀取文件
with open("1.png", "rb") as out:
    with io.TextIOWrapper(out, encoding="utf-8") as f:
        print(f.read())  # 這是一張圖片

import os
os.remove("1.png")

數據的壓縮

import io
import gzip


text = "這是一段長文本,我須要進行壓縮,否則我存不下去啊"
buf = io.BytesIO()

# 使用gzip.GzipFile進行壓縮。只須要指定mode:壓縮仍是解壓,fileobj:壓縮到什麼地方仍是從什麼地方解壓,便可
# 固然還能夠指定壓縮等級,範圍是0-9,默認是9,值越大計算越慢,可是壓縮程度越高
with gzip.GzipFile(mode="wb", fileobj=buf, compresslevel=9) as out:
    # 直接寫入就能夠了(須要轉化爲字節),會自動將寫入的內容進行壓縮,寫到fileobj裏面去。
    out.write(bytes(text, encoding="utf-8"))


# 怎麼把寫進去的東西獲取出來了
with gzip.GzipFile(mode="rb", fileobj=io.BytesIO(buf.getvalue())) as out:
    # 將mode改爲rb,將內容再次放到BytesIO裏面,而後調用out.read方法
    # 會自動的將讀出的內容進行解壓縮。
    print(str(out.read(), encoding="utf-8"))  # 這是一段長文本,我須要進行壓縮,否則我存不下去啊
相關文章
相關標籤/搜索