• python 高级用法 IO编程


    Prerequisite

    参考文章:廖雪峰的文章

    文件读写

    只记录平时用的比较多的

    # wb / rb 二进制形式写入 / 读取
    # b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
    # a 追加形式写入
    
    # open 函数中的参数
    # encoding='gbk' 编码
    # errors='ignore' 忽略文件中非法编码的字符
    
    # 几种常用的读写方法
    # read() 一次性读取文件的全部内容
    # read(size) 每次最多读取 size 个字节的内容
    # readline() 每次读取一行内容
    # readlines() 一次读取所有内容并按行返回 list
    
    
    # 自动调用 close 函数的读取方法
    with open('file', 'r') as f:
        print(f.read())
    
    # 读取每一行
    f = open('file', 'r')
    for line in f.readlines():
        print(line.strip()) # 把末尾的'\n'删掉
    f.close()
    

    StringIO 和 BytesIO

    从内存中读写数据,但对我没用,不记(硬气)

    操作文件和目录

    关于更多的 OS 标准库用法:Python 标准库之 os 模块详解

    import os
    import shutil
    
    os.name # 操作系统类型
    os.uname() # 获取详细的系统信息(Windows 不支持)
    os.environ # 在操作系统中定义的环境变量
    os.environ.get('PATH') # 获取某个环境变量的值
    
    os.path.abspath('.') # 查看当前目录的绝对路径
    '/Users/michael'
    os.mkdir('/Users/michael/testdir') # 然后创建一个目录
    os.rmdir('/Users/michael/testdir') # 删掉一个目录
    
    # 想要查看当前操作系统的拼接方式
    os.path.join(os.path.abspath('.'), 'temp')
    'C:\\Users\\xxx\\temp'
    
    # 想要合并 / 拆分路径
    os.path.join() / os.path.split()
    
    os.rename('test.txt', 'test.py') # 文件重命名
    os.remove('test.py') # 删掉文件
    shutil.copyfile() # 复制文件
    
    # 列出当前目录下的所有目录
    [x for x in os.listdir('.') if os.path.isdir(x)]
    
    # 列出所有的 .py 文件
    [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
    

    序列化

    序列化含义:把变量从内存中变成可存储或传输的过程
    反序列化含义:把变量内容从序列化的对象重新读到内存里

    简单来说:就是把变量储存进一个文件中,然后全平台操作系统,都可以无障碍读取这个文件;与编码的区别就是,编码还要注意格式,且储存的是字符(或者是代码本身),而不是这段数据(内存)
    PS:序列化在 Python 中叫 pickling,在其他语言中也被称之为 serialization,marshalling,flattening 等等,都是一个意思

    import pickle
    import json
    
    d = dict(name='Bob', age=20, score=88)
    
    f = open('dump.txt', 'wb')
    pickle.dump(d, f) # 把一个对象序列化并写入文件
    f.close()
    
    f = open('dump.txt', 'rb')
    d = pickle.load(f) # 从文件中反序列化出对象
    f.close()
    
    # 针对 JSON(注意数据的变化)
    
    d = dict(name='Bob', age=20, score=88)
    print(json.dumps(d)) # 序列化成 JSON
    '{"age": 20, "score": 88, "name": "Bob"}'
    
    json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    print(json.loads(json_str)) # 反序列化成 Python 对象
    {'age': 20, 'score': 88, 'name': 'Bob'}
    
    # 针对类
    
    class Student(object):
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score
        
    def student2dict(std):
        return {
            'name': std.name,
            'age': std.age,
            'score': std.score
        }
    
    def dict2student(d):
        return Student(d['name'], d['age'], d['score'])
    
    s = Student('Bob', 20, 88)
    print(json.dumps(s, default=student2dict)) # 序列化成 Python 对象
    print(json.dumps(s, default=lambda obj: obj.__dict__)) # 类自带的字典,序列化成 Python 对象
    {"age": 20, "name": "Bob", "score": 88}
    
    json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    print(json.loads(json_str, object_hook=dict2student)) # 反序列化成类的实例
    <__main__.Student object at 0x10cd3c190>
    
    # PS:写个好玩的,把类的实例序列化成 Python 对象,再序列化成 JSON
    print(json.dumps(json.dumps(s, default=student2dict)))
    "{\"name\": \"Bob\", \"age\": 20, \"score\": 88}"
    
  • 相关阅读:
    gulp+browser-sync使用方法
    小程序试用体验
    移动端调试总结
    函数防抖和函数分流
    页面返回顶部的方法总结
    POJ
    POJ
    UVA 10129 Play on Words(欧拉道路)
    UVA 10305 Ordering Tasks (拓扑排序)
    UVA 12657 Boxes in a Line(双向链表+小技巧)
  • 原文地址:https://www.cnblogs.com/CourserLi/p/16531570.html
Copyright © 2020-2023  润新知