zoukankan      html  css  js  c++  java
  • Python 的 IO 操作

    计算机处理数据基本上是 CPU 对寄存器里的数据做高速运算。寄存器的数据来自内存条,内存条的数据可以来自硬盘网卡光驱软盘USB 等等外部设备网络
    数据从外部设备进入内存称为 input,从内存输出到外部设备称为 output,合称 IO。

    外部储存设备的 IO:文件读写

    读取文本文件

    with open("./file.txt", "r") as file: # 模式为 r
        context = file.read() # 全部内容
        context = file.read(size) # 读取 size 个 byte 的内容
        context = file.readline() # 读取一行
        context_list = [line for line in file.readlines()] # 全部内容列表
        print(context)
    

    指定编码

    with open("./file.txt", "r", encoding="gbk", errors="ignore") as file: # 指定编码为 gbk,错误可忽略
        context = file.read()
    
    

    读取二进制文件

    with open("./file.txt", "rb") as file: # 模式为 rb
        context = file.read() # b"\xff\xe1"
    

    写文本文件

    with open("./file.txt", "w") as file:
        text = "text"
        context = file.write(text)
    

    指定编码

    with open("./file.txt", "w", encoding="gbk") as file: # 指定编码为 gbk
        context = file.write()
    

    写二进制文件

    with open("./file.txt", "wb") as file:
        text = "text"
        context = file.write(text)
    

    w 模式为覆盖,如果要追加用 a

    内存中创建的 IO

    内存中创建并读写 str 数据:io.StringIO

    In [1]: from io import StringIO
       ...: str_io = StringIO()
    
    In [2]: str_io.write("text1")
    Out[2]: 5
    
    In [3]: str_io.write("text2")
    Out[3]: 5
    
    In [4]: str_io.getvalue()
    Out[4]: 'text1text2'
    

    初始化时批量传入内容

    In [1]: from io import StringIO
    
    In [2]: str_io = StringIO("text1\ntext2\ntext3")
    
    In [3]: for line in str_io.readlines():
       ...:     print(line)
       ...: 
    text1
    
    text2
    
    text3
    

    内存中创建并读写二进制数据:io.BytesIO

    In [1]: from io import BytesIO
    
    In [2]: bytes_io = BytesIO()
    
    In [3]: bytes_io.write("网站".encode("utf-8"))
    Out[3]: 6
    
    In [4]: bytes_io.getvalue()
    Out[4]: b'\xe7\xbd\x91\xe7\xab\x99'
    

    初始化时批量传入内容

    In [1]: from io import BytesIO
    
    In [2]: bytes_io = BytesIO(b'\xe7\xbd\x91\xe7\xab\x99')
    
    In [3]: bytes_io.read()
    Out[3]: b'\xe7\xbd\x91\xe7\xab\x99'
    
    In [4]: bytes_io.getvalue()
    Out[4]: b'\xe7\xbd\x91\xe7\xab\x99'
    

    序列化与反序列化

    把数据弄成给人看的形式的过程是序列化,弄成方便机器处理的过程叫反序列化。
    Django REST framework 框架中的序列化器,将数据处理成 json 返回给前端叫序列化,把前端传过来的 json 数据转成 ORM 对象做处理叫反序列化。

    序列化有多个说法:picklingserializationmarshallingflattening,这些都是一回事,整的花里胡哨的。

    import pickle
    data = {
        "a":1,
        "b":2,
        "c":3,
    }
    ser_data = pickle.dumps(data)
    print(ser_data) # b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x01a\x94K\x01\x8c\x01b\x94K\x02\x8c\x01c\x94K\x03u.'
    unser_data = pickle.loads(ser_data)
    print(unser_data) # {'a': 1, 'b': 2, 'c': 3}
    

    序列化后写入文件

    import pickle
    with open("./a.txt", "wb") as f:
        data = {
            "a":1,
            "b":2,
            "c":3,
        }
        ser_data = pickle.dump(data, f)
    

    从文件反序列化内容

    import pickle
    with open("./a.txt", "rb") as f:
        ser_data = pickle.load(f)
    

    (本文完)

  • 相关阅读:
    [贪心]P1049 装箱问题
    js中字符串转换为日期和比较大小
    weblogic配置数据源出错
    myeclipse安装svn插件的多种方式
    使用令牌实现防重复提交
    struts1.3异常处理机制
    spring log4j.properties
    spring jdbc.property的配置与使用
    js循环array,json,map
    java web的一些特殊用法(一)
  • 原文地址:https://www.cnblogs.com/junsircoding/p/15664932.html
Copyright © 2011-2022 走看看