Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 536|回复: 0

Python文件和异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-8 23:36:11 | 显示全部楼层 |阅读模式

    程序和运行时数据是在内存中驻留的,涉及到数据交换的地方,通常是磁盘、网络等,因此需要IO接口。
    IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。
    CPU和内存的速度远远高于外设的速度。

    • 同步IO
    • 异步IO

    操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用。

    1. 文件

    1.1 读文件

    try:
    	f = open(r'C:\Users\84745\Desktop\test.txt', 'r')
    	print(f.read())
    finally:
    	if f:
    		f.close() # 关闭文件
    

    由于反斜杠在Python中被视为转义标记,为在Windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r
    文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

    Python引入了with语句来自动帮我们调用close()方法。

    with open(r'C:\Users\84745\Desktop\test.txt') as f:
    	contents = f.read()
    	print(contents)
    	
    
    # 逐行读取
    filename = 'pi_digits.txt'
    
    with open(filename) as f:
        for line in f:
            print(line)
    
    
    # 在with代码块外访问文件的内容
    filename = 'pi_digits.txt'
    
    with open(filename) as f:
        lines = f.readlines()
    
    for line in lines:
        print(line.rstrip())
    
    
    3.1415926535
      8979323846
      2643383279
    

    1.2 写文件

    写文件和读文件的唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件。
    当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

    filename = 'programming.txt'
    
    with open(filename, 'w') as f:
        f.write("I love programming.")
    

    1.3 序列化

    我们把变量从内存中变成可存储或传输的过程称之为序列化
    把变量内容从序列化的对象重新读到内存里称之为反序列化
    Python提供了pickle模块来实现序列化。

    >>> 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()
    >>> d
    {'name': 'Bob', 'age': 20, 'score': 88}
    

    1.3.1 JSON

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
    Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。

    >>> import json
    >>> d = dict(name='Bob', age=20, score=88)
    >>> json.dumps(d)
    '{"name": "Bob", "age": 20, "score": 88}'
    >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    >>> json.loads(json_str)
    {'age': 20, 'score': 88, 'name': 'Bob'}
    
    import json
    
    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
        }
    	
    	
    s = Student('Bob', 20, 88)
    print(json.dumps(s, default=student2dict))
    
    # {"name": "Bob", "age": 20, "score": 88}
    

    通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量。

    import json
    
    class Student(object):
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score
    
    
    s = Student('Bob', 20, 88)
    print(json.dumps(s, default=lambda obj: obj.__dict__))
    
    # {"name": "Bob", "age": 20, "score": 88}
    
    # 把JSON反序列化为一个Student对象实例。
    import json
    
    class Student(object):
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score
    
    
    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 0x00BBAA30>
    

    2. 异常

    Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。

    2.1 处理异常

    如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个Traceback,其中包含有关异常的报告。
    异常是使用try-except代码块处理的。

    try:
        print(5/0)
    except ZeroDivisionError:
        print("You can't divide by zero!")
    
    # You can't divide by zero!
    

    一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
    一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
    最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。
    try-except语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。

    2.2 抛出异常

    Python使用raise语句抛出一个指定的异常。
    raise唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(即Exception的子类)。


    参考资料:

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-15 05:32 , Processed in 0.072807 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表