• 第九章-IO编程


    IO是输出输入的意思

    在计算机中常用到的数据交换的地方是磁盘, 网络等

    输入流是从外面(磁盘, 网络)流进内存

    输出流是从内存流到外面(磁盘, 网络)

    同步IO是指等待IO完成再继续执行

    异步IO是在IO操作的时候CPU继续执行别的工作

    同步和异步的区别就在于是否等待IO执行的结果

    1 文件的读写

      文件的操作见我

    2 StringIO和BytesIO

    2.1 StringIO

      通过导入io模块来获得StringIO

      StringIO是在内存中读取str

      通过write()写入内容

      通过getvalue()方法获得的得到的内容str

      同样可以逆向操作, 读内存str, 此时可以使用read()和readline()方法

      具体操作如下

    from io import StringIO
    
    str = StringIO()
    str.write("hello")
    str.write(" ")
    str.write("world")
    print(str.getvalue())
    str = StringIO('Hello!
    Hi!
    Goodbye!')
    print(str.read())

    2.2 BytesIO

      StringIO操作的只能是str, 如果要操作二进制数据, 就需要使用BytesIO

      同样需要通过导入io模块来获得BytesIO   

      在Python中str类型是Unicode, 想要获得bytes需要使用encode方法会编码

      获得bytes内容用getvalue()

      读取bytes内容用read()

      具体实例如下

    from io import BytesIO
    
    f = BytesIO()
    f.write('中文'.encode('utf-8'))
    print(f.getvalue())
    # b'xe4xb8xadxe6x96x87'
    
    f = BytesIO(b'xe4xb8xadxe6x96x87')
    print(f.read())
    

    3 操作文件和目录

      导入os模块可以实现操作系统的dir, cp等功能

    import os

      查看操作系统类型, posix是Linux系列操作系统, nt是win系列系统

    os.name
    

      获取详细系统信息, unama()只是linux系统有

    os.uname()
    

      查看环境变量

    os.environ
    

      要获取某个环境变量的值

    os.environ.get('PATH')
    

      查看当前目录的绝对路径

    os.path.abspath('.')
    

      创建目录路径, 这样就可以避免在不同操作系统的路径分割符不同引起的问题

    os.path.join('/Users/michael', 'testdir')

      拆分路径, 可以将绝对路径分割成目录和文件名字

    >>> os.path.split('/Users/michael/testdir/file.txt')
    ('/Users/michael/testdir', 'file.txt')

      拆分路径, 可以将绝对路径分割成目录和文件后缀

    >>> os.path.splitext('/path/to/file.txt')
    ('/path/to/file', '.txt')

      创建目录

    os.mkdir('/Users/michael/testdir')

      删除目录

    os.rmdir('/Users/michael/testdir')
    

      文件的重命名

    os.rename('test.txt', 'test.py')

      文件的删除

    os.remove('test.py')

      列出当前文件夹的所有文件夹

    [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']
    

    4 序列化

    4.1 序列化

      程序中的数据如某个字典如果程序结束后, 这个字典也就在内存中释放了, 如果想要把内容保存起来的话, 就需要存入存储器或者网络中国

      此时有个快捷的方式是序列化

      序列化(pickling)又叫做serialization,marshalling,flattening等等

      具体实现可以导入pickle模块实现

      写成存储形式需要使用dumps()方法, 传入需要序列化的对象即可

      如果dumps()的第二个参数传入一个文件句柄的话, 就可以把内容存入到文件中, 不过文件需要以二进制模式写入

      对应的, 可以通过二进制方式读取文件, 可以通过load()方法来实现

      具体实例如下

    >>> import pickle
    >>> d = dict(name='Bob', age=20, score=88)
    >>> pickle.dumps(d)
    b'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00scoreqx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.'
    >>> f = open('dump.txt', 'wb')
    >>> pickle.dump(d, f)
    >>> f.close()
    >>> f = open('dump.txt', 'rb')
    >>> d = pickle.load(f)
    >>> f.close()
    >>> d
    {'age': 20, 'score': 88, 'name': 'Bob'}
    

    4.2 JSON

      除了通过序列化, 还可以通过JSON来保存获取数据

      通过导入json模块来实现功能

      可以通过dunps()函数来完成存储, 并且会返回一个处理好的字符串类型的数据

      对应的可以通过load()方法来解析json

      具体实例如下

    >>> import json
    >>> d = dict(name='Bob', age=20, score=88)
    >>> json.dumps(d)
    '{"age": 20, "score": 88, "name": "Bob"}'
    >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    >>> json.loads(json_str)
    {'age': 20, 'score': 88, 'name': 'Bob'}
    

      如果需要存储诸如类这样的数据的时候, 是无法存储的

      dumples()函数有个默认参数default, 可以通过给default传入一个函数来实现对对象数据的处理

      具体一般使用lambda表达式来将类对象转化为 __dct__ 属性

      对应的, 取得值的函数是loads(), 要通过对object_hook来传入 处理字符串的函数

      具体两个例子如下

    print(json.dumps(s, default=lambda obj: obj.__dict__))
    
    def dict2student(d):
        return Student(d['name'], d['age'], d['score'])
    
    >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    >>> print(json.loads(json_str, object_hook=dict2student))
    <__main__.Student object at 0x10cd3c190>
    

      

    人若有恒 无所不成
  • 相关阅读:
    读写二进制c# 二进制读写
    重构风险程序员一定要遵守的规则
    文件区域使用fcntl锁定文件,并且测试
    数据清空js清空div里的数据问题
    模板缓存ThinkPHP中的模板引擎和视图层
    描述null11121 Base 2
    操作系统请求操作系统 算法
    工程项目eclipse项目名前出现红色感叹号,小红叉解决
    程序链接关于静态链接,动态链接,共享库,ABI的一些记录(os学习)
    NMAKE命令行编译
  • 原文地址:https://www.cnblogs.com/weihuchao/p/6740653.html
Copyright © 2020-2023  润新知