• python学习(11)文件的读写操作


    1.读文件的7种操作模式

    操作模式具体含义
    'r' 读取 (默认)
    'w' 写入(会先截断之前的内容)
    'x' 写入,如果文件已经存在会产生异常
    'a' 追加,将内容写入到已有文件的末尾
    'b' 二进制模式
    't' 文本模式(默认)
    '+' 更新(既可以读又可以写)

    2.读取文本文件时,需要在使用open函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为'r'(如果不指定,默认值也是'r'),然后通过encoding参数指定编码(如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码),如果不能保证保存文件时使用的编码方式与encoding参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取失败。

    def main():
        f = open('123.txt','r',encoding='utf-8')
        print(f.read())
        f.close()
    if __name__ == '__main__':
        main()

    3.防止读写异常

    将那些在运行时可能会出现状况的代码放在try代码块中,在try代码块的后面可以跟上一个或多个except来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发FileNotFoundError,指定了未知的编码会引发LookupError,而如果读取文件时无法按指定方式解码会引发UnicodeDecodeError,我们在try后面跟上了三个except分别处理这三种不同的异常状况。最后我们使用finally代码块来关闭打开的文件。

    def main():
        f = None
        try:
            f = open('123.txt','r',encoding='utf-8')
            print(f.read())
        except FileNotFoundError:
            print('无法打开指定的文件!')
        except LookupError:
            print('指定了未知的编码!')
        except UnicodeDecodeError:
            print('读取文件时解码错误!')
        finally:
            if f:
                f.close()
    if __name__ == '__main__':
        main()

    4.读取文件的方式

    有三种:一次性读取完成;使用for-in按行读取;使用readlines()按行读取到列表中;

    使用with open()函数的时候可以不用f.open()函数,因为with open提供了一种自动关闭文件的功能。

    import time
    def main():
        # 一次性读取整个文件内容
        with open('123.txt',mode='r',encoding='utf-8') as f:
            print(f.read())
        # 通过for-in循环按行读取
        with open('123.txt',mode='r',encoding='utf-8') as f:
            for line in f:
                print(line,end='')
                time.sleep(1)
        print()
        # 读取文件按行读取到列表中
        with open('123.txt',mode='r',encoding='utf-8') as f:
            lines = f.readlines()
        print(lines)
        # with open提供了一种自动关闭文件的功能
    
    if __name__ == '__main__':
        main()

    5.将文本信息写入文件文件,在使用open函数时指定好文件名并将文件模式设置为‘w'即可。注意如果需要对文件内容进行追加式写入,应该将模式设置为'a'。如果要写入的文件不存在会自动创建文件而不是引发异常。下面的例子演示了如何将1-9999之间的素数分别写入三个文件中(1-99之间的素数保存在a.txt中,100-999之间的素数保存在b.txt中,1000-9999之间的素数保存在c.txt中)。

    from math import sqrt
    
    def is_prime(n):
        """判断素数的函数"""
        assert n > 0
        for factor in range(2,int(sqrt(n))+1):
            if n % factor == 0:
                return False
        return True if n != 1 else False
    def main():
        filenames = ('a.txt','b.txt','c.txt')
        fs_list = []
        try:
            for filename in filenames:
                fs_list.append(open(filename,'w',encoding='utf-8'))
            for number in range(1,10000):
                if is_prime(number):
                    if number < 100:
                        fs_list[0].write(str(number)+'
    ')
                    elif number < 1000:
                        fs_list[1].write(str(number)+'
    ')
                    elif number <10000:
                        fs_list[2].write(str(number)+'
    ')
        except IOError as ex:
            print(ex)
            print('写文件时发生错误!')
        finally:
            for fs in fs_list:
                fs.close()
        print('操作完成!')
    if __name__ == '__main__':
        main()

    6.读写二进制文件

    示例是一个读图片文件写为一个新的图片文件

    def main():
        # 读一个图片文件并写一个图片文件
        try:
            with open('123.jpg','rb') as fs1:
                data = fs1.read()
                print(type(data))
            with open('456.jpg','wb') as fs2:
                fs2.write(data)
        except FileNotFoundError as e:
            print('指定的文件无法打开!')
        except IOError as e:
            print('读写文件时出现错误!')
    
    if __name__ == '__main__':
        main()

    7.关于JSON的读写

      json模块主要有四个比较重要的函数,分别是:

    • dump - 将Python对象按照JSON格式序列化到文件中
    • dumps - 将Python对象处理成JSON格式的字符串
    • load - 将文件中的JSON数据反序列化成对象
    • loads - 将字符串的内容反序列化成Python对象

      序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。

    8.写一个json文件

    import json
    def main():
        mydict = {
            'name': '马文飞',
            'age': 20,
            'qq': 1154196461,
            'friends': ['翟华兵', '魏家剑','丁文杰','苏艺','秦旭壮'],
            'cars': [
                {'brand': 'BYD', 'max_speed': 180},
                {'brand': 'Audi', 'max_speed': 280},
                {'brand': 'Benz', 'max_speed': 320}
            ]
        }
        try:
            with open('data.json','w',encoding='utf-8') as fs:
                json.dump(mydict,fs)
        except IOError as e:
            print(e)
        print('保存数据完成!')
    if __name__ == '__main__':
        main()

    9.读json文件

    import json
    def main():
    
        try:
            with open('data.json','r',encoding='utf-8') as fs:
                temp = json.loads(fs.read())
                print(temp)
        except IOError as e:
            print(e)
    if __name__ == '__main__':
        main()

    10.requests模块请求json数据

    首先你要申请API 

    天行数据网址:https://www.tianapi.com/

    代码中我自己申请的开封空气质量和开封天气的API,测试很好用,要是报错的话,需要自己申请API网址已给出。

    import requests
    import json
    
    
    def main():
        # # 申请了一个查看空气质量的API 天行数据网址:https://www.tianapi.com/
        resp = requests.get('http://api.tianapi.com/txapi/aqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&area=开封')
        data_model = json.loads(resp.text)
        print(data_model['newslist'])
        # 申请了一个查看空气质量的API
        resp = requests.get('http://api.tianapi.com/txapi/tianqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&city=开封')
        data_model = json.loads(resp.text)
        print(data_model['newslist'])
    
    if __name__ == '__main__':
        main()

    运行结果:

  • 相关阅读:
    局部作用域内(scoped)使用@import引入css引发的css全局污染的问题
    html,js实现对联广告
    js实现无序列表
    js实现文本段落增删改查
    PyCharm2020安装教程,含破解包
    MCS开源app
    linux高性能服务器编程第八章高性能服务器程序框架 (1)
    linux高性能服务器编程第六章高级IO函数 (1)
    linux高性能服务器编程第六章高级IO函数 (3)
    linux高性能服务器编程第九章 I/O复用 (1)
  • 原文地址:https://www.cnblogs.com/ma1998/p/12880815.html
Copyright © 2020-2023  润新知