• headfirst python 03, 04


    文件与异常

    python中的输入机制是基于行的, open()函数与for 语句结合使用, 可以非常容易的读取文件.(打开->处理->关闭)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os
    
    os.getcwd()
    os.chdir('../abc/chap3')
    os.getcwd()
    data = open('abc.txt')
    print(data.readline(), end='')    #打印了第一行
    # 全部打印
    data.seek(0)  # 回到文件启始位置
    for each_line in data:
    print(each_line, end='')

    如果文件有固定的格式,  

    abc : bcd

    jqk : dee

    我们可以用:

    (role, line_spoken) = each_line.split(":")  # role = abc, line_spoken = bcd

    处理异常

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os
    
    os.getcwd()
    os.chdir('../abc/chap3')
    os.getcwd()
    data = open('abc.txt')
    print(data.readline(), end='')    #打印了第一行
    # 全部打印
    data.seek(0)  # 回到文件启始位置
    for each_line in data:
      try:
        (role, line_spoken) = each_line.split(':',1)
       print(role, end='')
        print('said: ', end = '')
        print(line_spoken, end = '')
      except:
        pass
    data.close()

    except IOError: # 制定异常类型.
    ValueError : 数据不符合期望的格式时会出现.
    IOError : 数据无法正常访问时会出现.

    数据保存到文件

    man = []

    other = []

    try:

      data = open('sketch.txt')

      for each_line in data:

        try:

          (role, line_spoken) = each_line.split(':', 1)

          line_spoken = line_spoken.strip()

          if role == 'Man':

            man.append(line_spoken)

          elif role == 'Other Man':

            other.append(line_spoken)

        except ValueError:

          pass

        data.close()

    except IOError:

      print('The datafile is missing!')

    print(man)

    print(other)

    以写模式打开文件

    out = open("data.out","w")

    print("asdf", file=out)

    out.close()

    以写模式打开文件时, 要特别注意程序失败时, 可能文件没有关闭, 文件可能就变成"脏数据"了, 为了避免这样的问题发生.

    在最后加上:

    finally:

      man_file.close()

      other_file.close()

    如果没有出现任何运行时错误, 会执行finally组中的代码, 同样的, 如果出现 IOError, 会执行except组, 然后再运行finally.

    错误的具体类型

     运行时出现一个错误时, python会产生一个特定类型的异常(如IOError, ValueError等), 另外, python会创建一个异常对象, 它作为一个参数传入 except 代码组.

    下面来看试图打开一个根本不存在的文件时会发生什么?

    try:

      data = open('missing.txt')

      print(data.readline(), end='')

    except IOError:

      print('File error')

    finally:

      data.close()

    错误提示信息:

    File error

    Traceback(most recent call last):

      File "<pyshell#8>", line 7, in<module>

      data.close()

    NameError: name 'data' is not defined

    文件不存在时, 数据文件对象并未创建, 这样就不可能在数据对象上调用close()方法, 所以, 最后会得到一个NameError错误.

    实际上, 通过以上的方法, 并不能很好的定位到错误, 还需要分析一部, 才能看到错误的本质.

    产生一个异常并由except组处理时, python解释器将一个异常对象传入这个except组, 只需做一个很小的修改就可以在代码中使用这个异常(作为一个标识符):

    except IOError as_err:  # 给异常对象一个名字

      print('File error: ' + str(err))

    这样做以后, 错误提示变成了:

    File error: [Error 2] No such file or directory: 'missing.txt'

    with

    由于处理文件时 try/except/finally模式相当常用, 所以python提供一个语句来抽象出相关的一些细节, 对文件使用with语句时, 可以大大减少需要编写的代码量, 因为有了with语句就不再需要包含一个finally组来处理文件的关闭, 例如:

    try:

      with open('its.txt', 'w') as data:  #使用 with 就不再使用 finally 了

        print("It's ...", file=data)

    except IOError as err:

      print('File error: ' + str(err))

    with 语句利用了一种名为 上下文管理协议(context management protocol) 的python技术.

    永久保存数据

    import pickle

    with open('mydata.pickle', 'wb') as mysavedata:   # 这里的b 是告诉python以二进制模式打开数据文件.

      pickle.dump([1, 2, 'Three'], mysavedata)  # 要保存数据, 使用dump()

    with open('mydata.pickle', 'rb') as myrestoredata:

      a_list = pickle.load(myrestoredata)  # 将恢复后的数据赋值给一个标识符.

    print(a_list)  # 一旦数据回到程序中, 就可以像任何其他数据对象一样处理了.

    综上, 程序修改

    import pickle

    try:

      with open('man_data.txt', 'wb') as man_file, open('other_data.txt', 'wb') as other_file:

        pickle.dump(man, man_file)

        pickle.dump(other, other_file)

    except IOError as err:

      print('File error: ' + str(err))

    except pickle.PickleError as perr:

      print('Picking error: ' + str(perr))

  • 相关阅读:
    nginx win10 配置启动bat脚本
    linux ctrl + s 导致锁死 解决
    linux 执行shell 不小心导致无限死循环解决
    linux vim 意外退出导致下次vim进入报错提示恢复
    vue 自定义组件使用vmodel属性的具体说明,重点说明参数的定义
    echarts 官网首页能进去,但是演示和文档地址进不去的 win10解决办法
    mysql 报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled
    elementui h5 引入elementui 报错提示没有字体
    .net 中文传参
    ASP.NET, IE6下URL中文乱码问题 ASP.NET程序,当URL后缀包含奇数个中文字符
  • 原文地址:https://www.cnblogs.com/moveofgod/p/6388622.html
Copyright © 2020-2023  润新知