zoukankan      html  css  js  c++  java
  • Day-11: IO编程

      由于CUP的运行速度远高于其他外设,IO操作有两种方式:

      同步IO:CUP登着,程序暂停直到执行完后续代码

      异步IO:CUP不等待,去做其他的事情,磁盘做完该做的事情后,告诉CUP,CUP再进行后续代码

      异步IO操作较为复杂,这里记录同步IO操作。

    • 文件读写

      Python中读写文件是通过由操作系统提供的。

      读文件:先使用open()方法打开文件,之后使用read()方法读入内存。

    >>> f = open('/Users/michael/test.txt', 'r')
    >>> f.read()
    'Hello, world!'

      最后,必须close()关闭文件,因为文件对象会占用操作系统的资源。

    >>> f.close()

      而在其中一旦出了错误,就会抛出IOError,为了保证最后能close(),使用with语句,来代替

    with open('/path/to/file', 'r') as f:
        print f.read()

      其中,read()一次性读取全部内容,read(size),每次读取size个字节的内容,readline()每次读取一行内容,readlines()一次读取所有内容,每一行都储存在list的一个元素中。

    对于readlines()可以使用:

    for line in f.readlines():
        print(line.strip()) # 把末尾的'
    '删掉

      凡是可以使用open()打开的对象,都是file-like Object。除了file外,还有内存的字节流,网络流,自定义流等。

      普通的文件是以ASCII码编写的,而对于图片,视频等是由二进制文件编写的,得用‘rb’模式打开。

      对于非ASCII编码的文件,必须得由二进制模式打开,再解码。比如GBK编码的文件:

    >>> f = open('/Users/michael/gbk.txt', 'rb')
    >>> u = f.read().decode('gbk')
    >>> u
    u'u6d4bu8bd5'
    >>> print u
    测试

    这里有简化的方法,利用codecs模块,自动转码

    import codecs
    with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
        f.read() # u'u6d4bu8bd5'

      写文件:写文件与读文件类似,为确保数据全部由内存写入文件,使用with语句

    with open('/Users/michael/test.txt', 'w') as f:
        f.write('Hello, world!')

    如有特定编码的文本文件,使用codecs模块。

    • 操作文件和目录

       获取环境变量:os.environ

      获取某个环境变量的值:os.getenv(‘PATH’)

      查看当前目录的据对路径:os.path.abspath('.')

      将两个路径拼成一个:os.path.join('/User/michael', 'testdir')

      创建一个目录:os.mkdir('/Users/michael/testdir')

      删除一个目录:os.rmdir('/Users/michael/testdir')

      拆分路径,得到最后一级的文件或目录名:os.path.split('/Users/michael/testdir/file.txt')

      拆分路径,得到文件扩展名:os.path.splitext('/path/to/file.txt')

      文件重命名: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']

    • 序列化

      变量从内存中变成可储存或传输的过程称为序列化,Python中负责序列化的叫做pickle和cPickle。

      pickle和cPickle的区别在于cPickle是用c写的,速度快;pickle是用python写的,速度慢。所以:

    try:
        import cPickle as pickle
    except ImportError:
        import pickle

      将对象序列化并写入文件:

    >>> 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'}

      pickle序列化对象后,存储的变量和原来的变量完全不一样,知识内容相同,而且每个语言序列化后的变量也是不一样的。为了在不同的编程语言间传递对象,必须把对象序列化为标准格式。Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。

    {} dict
    [] list
    "string" 'str'或u'unicode'
    1234.56 int或float
    true/false True/False
    null None

    使用json.dump方法

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

    类似的,dump()方法可以直接把JSON写入一个file-like Object

    JSON反序列化

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

    loads()把JSON的字符串反序列化,load()从file-like Object中读取字符串并序列化

    将Student实例变成一个JSON对象。

    def student2dict(std):
        return {
            'name': std.name,
            'age': std.age,
            'score': std.score
        }
    
    print(json.dumps(s, default=student2dict))

    将JSON反序列化为一个Student对象实例

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

      注:本文为学习廖雪峰Python入门整理后的笔记

  • 相关阅读:
    java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List 转换异常
    React Swiper轮播图(二)
    超详细带你入门开发一个超实用的浏览器插件
    手臂太细如何增加纬度?这5个手臂锻炼动作,让你的手臂变粗壮
    2021百度世界大会精华总结(AI应用向)
    1、saltstack 安装部署
    MySQL的varchar(10)能存多少个汉字
    学习资料总结
    基于Spark的数据工厂(Data Factory):从设计到实现
    IntelliJ IDEA创建maven web项目(IDEA新手适用)
  • 原文地址:https://www.cnblogs.com/likely-kan/p/7523315.html
Copyright © 2011-2022 走看看