zoukankan      html  css  js  c++  java
  • python学习六文件操作和异常处理

    1.文件的定义和类型

    什么是文件呢?
    1. 文件是数据的抽象和集合
    2. 文件是存储在辅助存储器上的数据序列
    3. 文件是存储的一种
    文件有哪些类型呢?
    1. 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件
    2. 文本文件时由单一特定编码组成,如UTF-8编码用于txt、py文件
    3. 二进制文件直接由比特0和1组成,没有统一的字符编码,如png图片文件,avi视频文件

    2.文件处理步骤

    文件处理可以分为三大步:

    1. 文件的打开

    2. 文件的具体操作

    3. 文件的关闭

    3.文件的打开和关闭

    文件打开有两种方式:

    1.直接采用open(文件名称)打开

    fileName = open('test1.txt')
    #注意:文件名称可以是文件相对与当前程序的路径,称为相对路径;
    #也可以是文件相对于电脑的路径,称为绝对路径。

    2.采用with… as… 打开

    filename = 'test1'
    with open(filename) as f:
        #文件操作代码

    文件的关闭:

    文件打开后必须关闭文件。不过在python解析器中,当程序关后会自动关闭文件。

    文件关闭语法 变量名.close()

    fileName = open('test1.txt')
    #文件操作代码
    filename.close()

    需要注意的是,采用with…as…方式打开的文件就不用我们在写关闭文件的代码。with…as…会自动在文件操作代码运行完成后关闭文件。

    4.文件的操作

    文件操作分为:读文件、写文件。

    读文件:

    读文件有三种操作方式,分别是:

    1. file.read(size)

      1. 读入全部内容,默认size=-1,如果size=n则读入前size长度
    2. file.readline(size)

      1. 读入一行内容,默认size=-1,如果给出参数,则读入该行前size长度的内容
    3. file.readlines(hint)

      1. 读入文件所有行,以每行为元素形成列表,默认hibt=-1,如果给出参数,则读入前hint行

    写文件:

    有两种操作方式外加一种辅助操作:

    1.file.write(s)

    向文件协议一个字符串或字节流

    f.write('中国是一个伟大的国家!')

    2.file.writeline(lines)

    将一个元素全位字符串的列表写入文件,字符串拼接后写入

    ls = ['中国', '法国', '美国']
    f.write(ls)
    #中国法国美国

    3.file.seek(offset)

    改变当前文件操作指针的位置,offset含义如下:
    0-文件开头;1-当前位置;2-文件结尾
    f.seel(0)#回到文件开头
    f.seel(1)#文件当前位置
    f.seel(2)#回到文件结尾

    文件写入和读取:

    fo = opne('test1.txt', 'w+')
    ls = ['中国', '法国', '美国']
    fo.writelines(ls)
    fo.seek(0)   #回到文件开头
    for line in fo:
        print(line)
    fo.close()

    文件打开模式:

    # “+”表示可以同时读写某个文件,如:r+读写、w+写读、x+写读、a+写读
    fileName = open('test1.txt') #默认使用文本形式和只读模式打开文件 fileName = open('test1.txt', 'rt')#文本制度模式打开文件 fileName = open('test1.txt', 'w')#文本形式,覆盖写模式打开文件
    fileName = open('test1.txt', 'a+')#文本形式,追加写模式+读文件
    fileName = open('test1.txt', 'x')#文本形式、创建写模式
    fileName = open('test1.txt', 'b')#二进制形式,只读模式
    fileName = open('test1.txt', 'wb')#二进制形式,覆盖写模式 fileName.close()

    文件的全文本操作:

    方法一:

    fname = input('请输入要打开文件的名称:')
    fo = open(fname, 'r')
    txt = fo.read()
    #对全文本txt进行处理
    fo.close()
    # 一次读入,统一处理,文本文件内容大消耗大

    方法二:

    fname = input('请输入要打开文件的名称:')
    fo = open(fname, 'r')
    txt = fo.read(2)   #每次最多读取2个字节的内容
    while txt != '':
        #对txt进行处理
        txt = fo.read(2)
    fo.close()
    # 分阶段,按数量读入,逐步处理 处理大文件更加可行有效

    分行储存的文件读写:逐行遍历文件

    fname = input('请输入要打开文件的名称:')
    fo = open(fname, 'r')
    for line in fo.readlines()
        print(line)
    fo.close()

    追加文件内容:

    f=open('file.json','a')
    f.write('wuya')  #在file.json文件中追加 wuya
    f.colse()

    文件的上下文处理:

    with open('file2','w') as f:
        f.write('wuya')

    5.异常处理

    异常:在程序运行过程中,不可避免的出现一些错误 例如用没赋值的变量等。Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生错误时,它都会创建一个异常对象,若编写了处理该异常的代码,程序将继续运行,

    否则程序将停止,并显示一个traceback其中包含有关异常的报告。

    异常处理语法:若try代码块中的代码运行起来没有问题,python将跳过except代码块;否则python将查找except代码块,并进行处理。而依赖于try代码块成功执行的代码都放在else代码块中。

    如果出现错误时,对错误不进行任何处理,可使用pass语句,pass还充当了占位符,提醒你程序的某个地方还什么都没做,以后也许要添加些代码常见异常如: FileNotFoundError, ZeroDivisionError,ValueError。无法确定异常类型时,就用except Exception,可以捕获所有异常。

    try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

    • 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
    • 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
    • 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
    try:
        #可能出现异常的代码块
    except:
        #出现异常后执行的代码块
    else:
    #若try模块没问题,会执行的代码块 finally: #不管有没有异常都会执行的代码块
    raise: #用于引发一个实际的异常,raise 可以单独作为语句使用,引发一个具体的异常对象;
    除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中
    一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的
    模块将引发一个 ImportError 异常。

    try:
        正常的操作
       ......................
    except(Exception1[, Exception2[,...ExceptionN]]]):
       发生以上多个异常中的一个,执行这块代码
       ......................
    else:
        如果没有异常执行这块代码
    print('异常出现前')
    try:
        print(a)
        print(10/0)
    except Exception as e:
    #except后面如果跟异常对象则默认捕获所有异常
    #由于Exception是所有异常对象的父对象所以except后面跟Exception捕获所有异常
        print(e,type(e))
    else:
        print('yi')
    finally:
        print('无论是否出现异常,finally都会执行')

    异常的参数:一个异常可以带上参数,可作为输出的异常信息参数。

    可以通过except语句来捕获异常的参数,如下所示:

    try:
        正常的操作
       ......................
    except ExceptionType, Argument:
        你可以在这输出 Argument 的值...

    变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。

    元组通常包含错误字符串,错误数字,错误位置。

    抛出(触发)异常:可以使用raise语句自己触发异常

    raise [Exception [, args [, traceback]]]
    
    #语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
    #最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
    #IndexError
    #NameError
    
    class AgeError(ValueError):
    pass
    
    age = 1000
    if 0 < age < 150:
    print('age legal')
    else:
    raise AgeError('age error')
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
        fh = open("testfile", "w")
        fh.write("这是一个测试文件,用于测试异常!!")
    except IOError:
        print "Error: 没有找到文件或读取文件失败"
    else:
        print "内容写入文件成功"
        fh.close()
    
    #输出结果
    $ python test.py 
    内容写入文件成功
    $ cat testfile       # 查看写入的内容
    这是一个测试文件,用于测试异常!!

    用户自定义异常:

    通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。

    以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。

    在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。

    class Networkerror(RuntimeError):
        def __init__(self, arg):
            self.args = arg

    定义以上类后,可以触发该异常,如下所示:

    try:
        raise Networkerror("Bad hostname")
    except Networkerror,e:
        print e.args

    python标准异常:

    异常名称描述
    BaseException 所有异常的基类
    SystemExit 解释器请求退出
    KeyboardInterrupt 用户中断执行(通常是输入^C)
    Exception 常规错误的基类
    StopIteration 迭代器没有更多的值
    GeneratorExit 生成器(generator)发生异常来通知退出
    StandardError 所有的内建标准异常的基类
    ArithmeticError 所有数值计算错误的基类
    FloatingPointError 浮点计算错误
    OverflowError 数值运算超出最大限制
    ZeroDivisionError 除(或取模)零 (所有数据类型)
    AssertionError 断言语句失败
    AttributeError 对象没有这个属性
    EOFError 没有内建输入,到达EOF 标记
    EnvironmentError 操作系统错误的基类
    IOError 输入/输出操作失败
    OSError 操作系统错误
    WindowsError 系统调用失败
    ImportError 导入模块/对象失败
    LookupError 无效数据查询的基类
    IndexError 序列中没有此索引(index)
    KeyError 映射中没有这个键
    MemoryError 内存溢出错误(对于Python 解释器不是致命的)
    NameError 未声明/初始化对象 (没有属性)
    UnboundLocalError 访问未初始化的本地变量
    ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
    RuntimeError 一般的运行时错误
    NotImplementedError 尚未实现的方法
    SyntaxError Python 语法错误
    IndentationError 缩进错误
    TabError Tab 和空格混用
    SystemError 一般的解释器系统错误
    TypeError 对类型无效的操作
    ValueError 传入无效的参数
    UnicodeError Unicode 相关的错误
    UnicodeDecodeError Unicode 解码时的错误
    UnicodeEncodeError Unicode 编码时错误
    UnicodeTranslateError Unicode 转换时错误
    Warning 警告的基类
    DeprecationWarning 关于被弃用的特征的警告
    FutureWarning 关于构造将来语义会有改变的警告
    OverflowWarning 旧的关于自动提升为长整型(long)的警告
    PendingDeprecationWarning 关于特性将会被废弃的警告
    RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
    SyntaxWarning 可疑的语法的警告
    UserWarning 用户代码生成的警告
  • 相关阅读:
    PHP学习笔记-session
    [C语言] 插入排序之希尔(shell)排序的特性及实现
    [C语言] 插入排序之二分插入排序的特性及实现
    [C语言] 插入排序之直接插入排序的特性及实现
    [Linux环境编程] TCP通信与多线程编程实现“多人在线聊天室”
    [Linux环境编程] 信号的基本概念与操作函数
    [Linux环境编程] Linux系统命令“rm -rf”的实现
    [Linux环境编程] Linux系统命令“ls -R”的实现
    [Linux环境编程] Linux系统命令“ls -l”的实现
    [C语言] 单向链表的构建以及翻转算法_图文详解(附双向链表构建代码)
  • 原文地址:https://www.cnblogs.com/dydxw/p/14246028.html
Copyright © 2011-2022 走看看