io: easily create cache

Introduction

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进行包装的话,那么打开的方式一定要是二进制的方式

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")

Compressed data

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"))  # 这是一段长文本,我需要进行压缩,不然我存不下去啊

Guess you like

Origin www.cnblogs.com/traditional/p/11111345.html