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)
    

    (本文完)

  • 相关阅读:
    hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
    HDU 2147 kiki's game(博弈)
    C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
    C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
    C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
    C++学习44 格式化输出,C++输出格式控制
    C++学习43 输入输出有关的类和对象
    C++学习42 输入和输出的概念
    C++学习41 exception类
    C++学习40 抛出自己的异常
  • 原文地址:https://www.cnblogs.com/junsircoding/p/15664932.html
Copyright © 2011-2022 走看看