zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    vi/vim系统编辑命令使用技巧
    C++基础之智能指针
    C++基础之volatile关键字
    C++基础之强制类型转换
    C++基础之左值、右值与移动语义
    C++基础之对象模型
    C++基础之运行时类型识别RTTI
    C++基础之指针与引用的底层实现
    深度学习之参数计算(CNN为例)
    数学基础之勾股数
  • 原文地址:https://www.cnblogs.com/moveofgod/p/6388622.html
Copyright © 2011-2022 走看看