• 10.文件的输入输出、异常


    1.文件的输入输出

    #1.打开文件 open 函数
    open(file,[option])
    #file 是要打开的文件
    #option是可选择的参数,常见有 mode  等
    
    #2.文件的打开模式
    r 只读模式,文件不存在时会报错。
    w 写入模式,文件存在会清空之前的内容,文件不存在则会新建文件。
    x 写入模式,文件存在会报错,文件不存在则会新建文件。
    a 追加写入模式,不清空之前的文件,直接将写入的内容添加到后面。
    b 以二进制模式读写文件,wb,rb,ab。
    + 可读写模式,r+,w+,x+,a+,这几种模式还遵循了r,w,x,a的基本原则。
    
    #3.文件的读取
    f.read(size)  #读取文件的内容,将文件的内容以字符串形式返回。
    '''size是可选的数值,指定字符串长度,如果没有指定size或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时就会产生问题,反之就尽可能大的size读取和返回数据,如果到了文件末尾,会返回空字符串。
    '''
    
    f.readline() #从文件中读取单独一行。
    '''字符串结尾会自动加上一个换行符
    ,只有当文件最后没有以换行符结尾时,这一操作才会被忽略,这样返回值就不会有混淆。如果返回空字符串,表示到达率文件末尾,如果是空行,就会描述为
    ,一个只有换行符的字符串。
    '''
    
    f.readlines() #一次读取所有,返回一个列表,列表的元素为文件行的内容。
    '''可以通过列表索引的方式将文件的每一行的内容输出。
    可以通过for循环迭代输出每一行的信息。
    '''
    
    #4.文件的写入
    f.write()         #将要写入的内容以字符串的形式通过write方法写入文件中。
    f.writelines()  #括号里必须是由字符串元素组成的序列。
    
    #5.保存和关闭
    f.flush()
    #在读写模式下,当写完的数据想要读取出来时,要先缓存区的内容保存到文件当中。
    
    f.close() 
    #关闭文件。对一个已经关闭的文件进行操作会报错。
    
    
    #6.光标位置
    f.tell()             #返回光标在文件中的位置。
    f.seek(offset,from) #常用 f.seek(0) 返回起始位置
    #在文件中移动文件指针,从from(0代表起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节。
    # 常用 f.seek(0,0)  返回起始位置。 其他了解一下
    
    
    #7.查看文件信息
    closed         #查看文件是否已经关闭,返回布尔值。
    mode         #返回文件打开模式。
    name         #返回文件名。
    
    #8.with 形式打开文件,里面的语句执行完后会自动关闭文件
    with open('文件名') as f:
        f.read() 
    #open()
    '''
    r 只读模式,文件不存在时会报错。
    w 写入模式,文件存在会清空之前的内容,文件不存在则会新建文件。
    x 写入模式,文件存在会报错,文件不存在则会新建文件。
    a 追加写入模式,不清空之前的文件,直接将写入的内容添加到后面。
    b 以二进制模式读写文件,wb,rb,ab。
    + 可读写模式,r+,w+,x+,a+,这几种模式还遵循了r,w,x,a的基本原则。
    
    
    '''
    "f = open('test.txt','r') "
    
    " f = open('test.txt','w') "
    
    ## 默认建立在当前目录
    
    
    ###  绝对路径    E:16班基础5高级专题  ##贾转义  r
    
    " f = open(r'E:16班基础5高级专题	est.txt','w') "
    " f = open('E:\16班基础\5高级专题\test.txt','w') "
    
    path = r'E:16班基础5高级专题	est.txt' 
    
    " f = open(path,'w') "
    
    
    # <class '_io.TextIOWrapper'>  文件类 / 流类
    
    
    ### 操作
    '''
    打开 ,关闭  ,写入 ,读取
    
    '''
    " f = open('test.txt','w')  "  #以写的方式
    
    ##  +  可读写,  在原来的基础上,多加加了项  读写功能
    " f = open('test.txt','w+')  "
    
    " f = open('test.txt','r+')  "
    
    
    ###  read 操作
    
    "f.read() " #将文件所有内容, 以字符串返回  ,一个
    
    
    
    ### f.readline()   返回每一行  
    " f.readline() "
    
    
    
    
    
    
    
    ##引入  文件指针  (光标)
    ##tell   seek
    " f.tell()  "  #告诉光标的位置
    "f.seek(0) "   #重置光标位置
    
    
    
    #汉字占两个字节
    '''
    编码问题:
     cp936  =  GBK  (中文编码), 2字节
     UTF-8  国际编码    3字节
    '''
    
    
    #readlines
    
    " f.readlines()"  #列表方式返回 ,(str)
    #li = f.readlines()
    '''
    for i in li:
        print(i)
    
    '''
    
    
    
    
    
    ### 写 write
    
    ''' 
    f.write('jianneg')  #缓存
     f.flush()       #将缓存 写入  硬盘
    '''
    
    
    #writelines()
    li =['jianeng','python','6666','rng']
    #f.writelines(li)
    
    #li =['jianeng','python','6666','rng',12] #不能有数字
    
    
    ###文件  属性
    
    #f.closed
    #f.mode
    #f.name
    #f.encoding
    
    #8.with 形式打开文件,里面的语句执行完后会自动关闭文件
    '''
     with open('test.txt','w+') as f:
        f.write('haha')
    '''
    
    
    ##close  的时候,自动flush

    2.异常语法

    try:
        suite1            #测试语句块
    except exception1:
        suite2            #如果测试语句suite1中发生exception1异常时执行
    except (exception2,exception3):
        suite3          #如果测试语句suite1中发生元组中任意异常时执行
    except exception4 as reason:    #as把异常的原因赋值给reason
        suite4           #如果测试语句suite1发生exception4的异常时执行
    except:
        suite5          #如果测试语句suite1发生异常在所列出的异常之外时执行
    else:
        suite5          #如果测试语句块suite1中没有发生异常时执行
    finally:
        suit6           #不管测试语句suite1中又没有发生异常都会执行
        
    '''
    注意:中间的except,else,finally都是可选的,但至少有一个,不然try就没有意义了,根据实际中的需求来选择。
    所有错误类型都继承自BaseException
    https://docs.python.org/3/library/exceptions.html#exception-hierarchy
    '''
    
    #注意:如果抛出父类异常,在子类不会再获取,如下:
    try:
        fun()
    except Exception as e:
        raise Exception
    except ImportError as e:
        raise ImportError
    finally:
        pass
        
    '''
    在上面的例子中,下面的ImportError就不会被抛出,应为ImportError继承Exception,但是可以把Exception放在后面是可以的
    e可以得到系统给出的报错信息
    '''
    
    assert #断言
    '''
    测试表示式,其返回值为假,就会触发异常
    '''
    
    assert 1==1     #没有返回值
    assert 1==2     #返回AssertionError

    example:

    #异常语法,  (为了让错误,不影响程序运行)(如果报错了,选择性的弥补)
    
    try:
        b = 3
        d = 2
        b % d   # NameError
    except TypeError:      #同级
        print('你的类型错误')
    except NameError:
        print('没有定义')
    except ValueError:
        print('值错误')
    except Exception:
        print('b % d,报错了')
    
    else:   #当try 里面没有  报错,就执行 else
        print('没有问题')
    
    finally:
        print('不管你报不报错,我都要执行')
    
    
    try:
        f = open('test.txt','w')
        f.read()
    except Exception:
        print('文件操作有误')
    finally:
        f.close()
    
    
    
    print(f.closed)
    
    a = 1
    
    
    #  raise   故意报错,显性的引发异常
    
    try:
        a = input('输入数字: ')
        if a.isdigit():
            print('输入成功',a)
        else:
            raise TypeError    #报错,TypeError
        
    except TypeError:
        print('类型错误') 
    except Exception:
        print('您输入有误')
    
    
    # assert #断言   返回False 就弹出异常
    
    '''
    assert 1>2
    assert isinstance(1,(str,int))
    assert isinstance(1,(str,float))
    
    '''

    3.作业

    #1.打开文件,修改内容,写入另一个文件。
    #  把文件reform.txt中的名人名言改成“某某说:......”的形式保存到另一个文件中。
    '例:雨果说:大胆是取得进步所付出的代价。'
    reform.txt内容如下
    大胆点,伟大无比的力量自会来帮助你。——比锡耳王
    
    大胆是取得进步所付出的代价。——雨果
    
    不怕的人前面才有路。——有岛武信
    
    世界是属于勇敢者的。——哥伦布
    
    走自己的路,叫别人去说吧。——但丁
    
    死是每个人都能做到的,拿出勇气活下去才是勇敢。——罗教·柯迪
    
    人的一生中可能犯的错误,就是经常担心犯错误。——哈伯德
    
    没有比害怕本身更害怕的了。——培根
    
    你怕狼,就别到树林里去。——列宁
    
    人生自古谁无死,留取丹心照汗青。——文天祥
    def read():
        f = open('reform.txt','r')
        change = open('change.txt','r+')
        li = f.readlines()
        li = li[::2]
        for i in li:
            said,who = i.split('——')
            who = who.replace('
    ','')
            print(who+'说:'+said+'
    
    ')
            change.write(who+'说:'+said+'
    
    ')
    View Code
    
      
    #2.针对实例化矩行类时,输入字符串等错误参数,写一个提示异常。
    '''
    class Rectangle:
        def __init__(self,length,width):
            if isinstance(length,(int,float)) and isinstance(width,(int,float)):
            #if ( type(length) == int or  type(length) == float )  and (type(width) ==int or type(widh) == float):
                self.length = length
                self.width = width
            else:
                return 'ERROR'
        def area(self):
            return self.length * self.width
      
    '''
    '''
    try:
        n
    except Exception:
        print(Exception)
    '''
    #方法一  raise  相当于return ,将程序结束,并且返回一个异常
    '''
    class Rectangle:
        def __init__(self,length,width):
            if isinstance(length,(int,float)) and isinstance(width,(int,float)):
            #if ( type(length) == int or  type(length) == float )  and (type(width) ==int or type(widh) == float):
                self.length = length
                self.width = width
            else:
                #return 'ERROR'
                raise TypeError('请输入int,float')
        def area(self):
            return self.length * self.width
    
    '''
    #方法二  assert
    '''
    class Rectangle:
        def __init__(self,length,width):
            assert isinstance(length,(int,float)) and isinstance(width,(int,float))
            self.length = length
            self.width = width
                
        def area(self):
            return self.length * self.width
    '''
     
    #方法三 try  except
    '''
    try:
        
        class Rectangle:
            def __init__(self,length,width):
                if isinstance(length,(int,float)) and isinstance(width,(int,float)):
                #if ( type(length) == int or  type(length) == float )  and (type(width) ==int or type(widh) == float):
                    self.length = length
                    self.width = width
                else:
                    return 'ERROR'
                    #raise TypeError('请输入int,float')
            def area(self):
                return self.length * self.width
    
    except Exception:
        print(Exception)
    '''
    
    '''
    class Rectangle:
        def __init__(self,length,width):
            try:
                if isinstance(length,(int,float)) and isinstance(width,(int,float)):
                #if ( type(length) == int or  type(length) == float )  and (type(width) ==int or type(widh) == float):
                    self.length = length
                    self.width = width
                else:
                    raise TypeError
                    #1/0
            except TypeError:
                raise TypeError
            
        def area(self):
            return self.length * self.width
    以上两种try except,哪种好呢。一般我们在可能报错的时候,再插入try except捕捉异常,在
    肯定不会出错的地方就不用了,所以应该选择下面的写法
    '''
    View Code
  • 相关阅读:
    875. 家的范围
    Codeforces 1260D A Game with Traps(二分查找)
    Codeforces 1260D A Game with Traps(二分查找)
    Codeforces 1260C Infinite Fence(扩展欧几里得有解的条件)
    Codeforces 1260C Infinite Fence(扩展欧几里得有解的条件)
    Codeforces 1260B Obtain Two Zeroes
    Codeforces 1260B Obtain Two Zeroes
    Codeforces1260A Heating
    Codeforces1260A Heating
    HDU 2795 Billboard(线段树查询区间最大值)
  • 原文地址:https://www.cnblogs.com/woaixuexi9999/p/9215666.html
Copyright © 2020-2023  润新知