(十二)文件和异常

1. 从文件中读取数据

1.1 读取整个文件内容

with 方法:

with open('test.txt') as file_project:
      contents = file_project.read()
        print(contents)

open-close 方法:

fo = open('test.txt')
contents = fo.read()
print(contents)
fo.close() # 注意关闭文件

说明:

  1. with 使得我们不需要手动关闭文件;打开文件就必须要关闭文件,否则文件会出现数据丢失等问题;
  2. open() 函数打开一个文件,参数是文件名,必要时带上相对路径;
  3. file_project 是构造的一个文件对象,在 with 块内对其进行操作;
  4. read() 方法读取整个文件,返回一个字符串;

1.2 逐行读取(一)

filename = 'test.txt'
with open(filenname) as file_project:
        for line in file_project:
              print(line.rstrip())

1.3 逐行读取(二)

filename = 'test.txt'
with open(filenname) as file_project:
      lines = file_project.readlines()
for line in lines:
      print(line.rstrip())

说明:

  1. readlines() 读取文件内容的每一行,包括换行 \n,返回一个列表;
  2. readline([size]) 按照读取次数从上到下依次读取一行;
  3. rstrip() 是为了消除换行 \n

1.4 处理读取的文件内容

filename = 'test.txt'
with open(filename) as file_project:
      lines = file_project.readlines()
string = ''
for line in lines:
      string += line.rstrip()

2. 写入文件

2.1 覆盖重写

with open('1.txt', 'w') as file_project:
      file_project.write('I like Python.')

w (只读)方式对文件写入,会覆盖原始数据。

2.2 附加写入

with open('1.txt', 'a') as file_project:
        file_project.write('I like Python.')

a (附加)形式写入,会在原文件内容后面新增一条数据。

2.3 清空文件内容

with open('1.txt', 'w') as file_project:
      file_project.truncate()

w (写入)形式使用 truncate 方法清空文件数据。

3. 文件读写总结

格式一:

fo = open(filename, mode, buffering=-1, encoding=None)
# 文件操作
fo.close()

格式二:

with open(filename, mode, buffering=-1, encoding=None) as file_project:
      # 文件操作

参数说明:

  • filename : 文件名
  • mode : 打开文件的模式
  • buffering: 是否缓冲;0=不缓冲,1=缓冲, >1的int数=缓冲区大小
  • encoding: 文件编码,一般是 utf-8

mode 参数:

模式 说明
r 只读 模式;若文件不存在则报错;默认模式。
rb 二进制格式只读;但文件属于非文本,默认模式。
r+ 读写 模式。文件指针将会放在文件的开头。
rb+ 二进制格式 读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 只写 模式;如果该文件已存在则打开文件,并从开头编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 二进制格式 只写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 读写 模式。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于 读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 追加 模式;如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 二进制格式 追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 读写 模式。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab+ 二进制格式 追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
+ 更新 模式,可读可写。
x 只写 模式,新建一个文件,如果该文件已存在则会报错

4. 异常

4.1 try-except

4.2 try-except-else

  • 将要验证是否出错的代码段放在 try 块中,将通过 try 块后要执行的代码放在 else 中;excpet 中的代码是对错误的处理。
  • excpet 块和 else 中的代码只会执行其一,try 中无错误,则 else 就执行。

4.3 except 语句块

(一)使用异常类型 ErrorObjectError

try:
    # ...
except ErrorObjectName:
    # ...
else:
    # ...

ErrorObjectName 是内的置异常错误对象,比如 FileNotFoundErrorZeroDivisionErrorSyntaxError 等等。

(二)不使用任何异常类型

try:
  # ...
except:
  # ...
else:
  # ...

4.4 结合 pass 语句实现

except:
    pass

5. 常见异常

异常名称 描述
Exception 常规错误的基类
ZeroDivisionError 除(或取模)零 (所有数据类型)
IOError 输入/输出操作失败
IndexError 序列中没有此索引(index
KeyError
NameError 未声明/初始化对象 (没有属性)
FileNotFoundError
SyntaxError Python 语法错误
StopIteration
ImportError 导入模块/对象失败
IndentationError 缩进错误
TabError Tab 和空格混用
ValueError 传入无效的参数
AttributeError 对象没有这个属性

6. 存储数据

6.1 使用 json

使用 json.dump()json.load() 来写入和读取json数据

  • json.dump(data, file_project)

    接收两个参数,要写入的数据 data 和 写入的文件对象 file_project

    import json
    filename = 'numbers.json'
    numbers = [12, 13, 14, 15, 16, 17, 18, 19, 20]
    with open(filename, 'w') as f_object:
        json.dump(numbers, f_object)
    
  • json.load(file_project)

    with open(filename, 'r') as f_object:
        numbers = json.load(f_object)
    print(numbers)