zoukankan      html  css  js  c++  java
  • 温故而知新--day3

    文件操作

    在python对文件操作用的是open函数,其一般使用形式是f = open(file, encoding,mode)file是文件路径,encoding是文件编码,mode是打开文件的模式,f称为文件句柄。
    一般的文件编码有:

    • ASCII码, 总共有 128 个。
    • ISO-8859-1,别名为Latin1,涵盖了大多数西欧语言字符,单字节编码,它总共能表示 256 个字符。
    • Unicode,它只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
    • UTF-8,Unicode 的实现方式之一,是一种变长的编码方式。
    • GB2312,全称《信息交换用汉字编码字符集 基本集》,总共包含 682 个符号、 6763 个汉字。
    • GBK,是国家技术监督局为 windows95 所制定的新的汉字内码规范,扩展了 GB2312。

    默认以操作系统的编码方式打开

    打开文件的模式有:

    模式 符号
    r
    w
    追加 a
    字节形式 b
    文本形式 t
    更新(可读可写) +

    默认mode="rt"

    读取文件的方法有一下几个:

    • .read(n=-1) 读取文件,默认全部读取
    • .readline() 读取一行
    • .readlines() 读取全部,放入到list中

    一些与读取相关的方法:

    • .readable() 是否可读
    • .tell() 显示光标位置
    • .seek() 设置光标位置
    • .close() 关闭文件
    • .closed 文件是否关闭

    假如有这样一个文件(./test.txt):

    test file line1
    test file line2
    test file line3
    

    使用open例子:

    f = open("./test.txt", mode="r", encoding="utf-8")
    
    
    print(f.readable())     # True
    print(f.read())
    print(f.tell())     # 49 # 查看光标位置
    
    f.seek(0)  # 把光标放到开头位置
    
    print(repr(f.readline()))         # 'test file line1
    '
    print(f.readlines())        # ['test file line2
    ', 'test file line3']
    f.close()       # 关闭文件
    print(f.closed)     # True
    

    直接用open操作文件时,不要忘了使用close()方法关闭文件

    seek补充
    seek方法有三种模式,用第二个参数的值确定。

    • 0 默认值,以绝对位置移动
    • 1 以相对位置移动
    • 2 从文件尾部移动

    注意:非默认模式(12)时,Python 要求文件必须要以二进制格式(b)打开,否则会抛出io.UnsupportedOperation错误。
    例子

    # test.txt有44个字符
    
    f = open("./test.txt", mode="rb")
    f.seek(10, 0)       # 默认形式,以绝对位置
    print(f.tell())     # 10
    f.seek(10, 1)       # 相对位置,往前移10个字符
    print(f.tell())     # 20
    f.seek(-10, 2)      # 从文件尾部开始移动,注意数值是负数的
    print(f.tell())     # 34
    f.close()
    

    使用写的方法会把原文件清空然后重新写入,同样先列出其相关方法:

    • .write() 写入
    • .writelines() 以list形式迭代写入
    • .writable() 是否可以写入
    • .flush() 刷到硬盘保存

    例子:

    f = open("./test.txt", mode="w", encoding='utf-8')
    
    print(f.writable())
    
    f.write("new line1
    ")
    f.writelines(["new line2
    ", "new line3
    "])
    f.close()
    
    

    写的时候写入字符串或字节类型(根据mode参数而定)

    f = open("./test.txt", mode="w",  encoding='utf-8')
    
    f.write("new line1
    ")
    f.close()
    
    
    # 字节方式
    f = open("./test.txt", mode="bw")
    f.write("new line2
    ".encode('utf-8'))
    
    f.close()
    

    追加

    追加,即在原文件的尾部写入。

    f = open("./test.txt", mode="a",  encoding='utf-8')
    
    print(f.tell())     # 33 # 在最后
    f.write("new line4
    ")
    f.close()
    
    

    open与with

    open支持上下文管理协议,即可以与with函数结合使用,使用with函数,我们就不需要在最后使用close()方法,手动将文件关闭了。

    with open("./test.txt", "r", encoding='utf-8') as f:
        print(f.read())
    

    异常处理

    python使用try-except-else-finally的形式处理异常,一般来说,常用的格式是try-excepttry中写正常的逻辑代码,而except中写处理异常的代码。else表示try中代码不出错时执行;finally中的代码不管出不出错多执行,可以在这里写释放资源等的代码。

    使用例子

    例子一:

    try:
        print(1234)
        raise Exception("手动触发的异常")
    except Exception as e:
        print(e)        # 手动触发的异常
    finally:
        print("finally执行了")
    

    例子二:

    try:
        print(1234)
        #raise Exception("手动触发的异常")
    except Exception as e:
        print(e)        # 手动触发的异常
    else:
        print("正常执行了")
    finally:
        print("finally执行了")
    
    

    巧用with实现异常处理

    直接使用try execpt进行异常处理,容易使代码看起来比较臃肿,使用with的替代不失为一种比较好的方法。
    使用contextlib.contextmanager实现,关于使用方式见:__enter__和__exit__:上下文管理协议这部分的内容。

    from contextlib import contextmanager
    
    
    @contextmanager
    def transform(data):
        """[summary] 将数据转换int
    
        Args:
            data ([str]): [数据]
        """
        try:
            yield int(data)
        except ValueError:
            print("数据异常")
            yield
    
    
    with transform("123") as t:
        print(t)
    
    

    自定义异常类

    在python内部有一些内置的异常类,一般来说我们可以直接使用他们,假如是特殊的情况,我们可以继承其中一个类,自己自定义异常类。

    常见异常类

    自定义异常类例子:

    class NumError(ValueError):
        """输入小于0参数的异常类"""
        def __init__(self, num):
            # 写你需要的参数
            self.num = num
    
        def __str__(self):
            # 描述信息
            return "数值不能小于0,你输入的数值为%d" % self.num
    
    
    def test(num):
        if num > 0:
            print("processing ....")
        else:
            raise NumError(num)		# 手动抛出异常
    
    
    def main():
        test(2)
        test(-1)       # __main__.NumError: 数值不能小于0,你输入的数值为0
    
    
    if __name__ == '__main__':
        main()
    

    相关:
    温故而知新--day1
    温故而知新--day2
    温故而知新--day4
    温故而知新--day5

    本文来自博客园,作者:忞翛,转载请注明原文链接:https://www.cnblogs.com/lczmx/p/14312344.html

  • 相关阅读:
    ASP.Net Cms
    GetHashCode函数所存在的陷阱
    NH的系统架构
    Icomparable<T> 和 Icomparaer<T> 实现顺序关系
    《创业法典》:用流程图告诉你如何创业
    创业之前,网站先行
    杨卫华:新浪微博的架构发展历程
    技术开发人员为什么会无奈苦逼?
    使用面向对象的、完整的单点登录功能
    SilverLight之我见
  • 原文地址:https://www.cnblogs.com/lczmx/p/14312344.html
Copyright © 2011-2022 走看看