若指定的文件不存在,则以哪种方法打开文件会报异常。( )
A.a
B.a+
C.r+
D.w+
| 模式 | 完整写法 | 文件不存在时 | 文件已存在时 | 写入位置 | 读/写权限 | 对原内容的处理 |
|---|---|---|---|---|---|---|
| r | open('file', 'r') |
报错 FileNotFoundError |
正常打开 | 文件开头 | 只读 | 保留原内容 |
| r+ | open('file', 'r+') |
报错 FileNotFoundError |
正常打开 | 文件开头 | 读写 | 保留原内容 |
| w | open('file', 'w') |
创建新文件 | 正常打开 | 文件开头 | 只写 | 清空原内容 |
| w+ | open('file', 'w+') |
创建新文件 | 正常打开 | 文件开头 | 读写 | 清空原内容 |
| a | open('file', 'a') |
创建新文件 | 正常打开 | 文件末尾 | 只写 | 保留原内容,追加写入 |
| a+ | open('file', 'a+') |
创建新文件 | 正常打开 | 文件末尾 | 读写 | 保留原内容,追加写入 |
| x | open('file', 'x') |
创建新文件 | 报错 FileExistsError |
文件开头 | 只写 | 不适用(报错,操作失败) |
| x+ | open('file', 'x+') |
创建新文件 | 报错 FileExistsError |
文件开头 | 读写 | 不适用(报错,操作失败) |
快速分类速查表
① 按"文件不存在时"分类
| 行为 | 模式 |
|---|---|
| 报错 | r、r+ |
| 创建新文件 | w、w+、a、a+、x、x+ |
② 按"文件已存在时"分类
| 行为 | 模式 |
|---|---|
| 报错 | x、x+ |
| 正常打开 | r、r+、w、w+、a、a+ |
③ 按"写入位置"分类
| 写入位置 | 模式 |
|---|---|
| 文件开头 | r+、w、w+、x、x+(r 不能写) |
| 文件末尾(追加) | a、a+ |
④ 按"读/写权限"分类
| 权限 | 模式 |
|---|---|
| 只读 | r |
| 只写 | w、a、x |
| 读写 | r+、w+、a+、x+ |
⑤ 按"对原内容的处理"分类(仅文件存在时有效)
| 处理方式 | 模式 |
|---|---|
| 保留原内容 | r、r+、a、a+ |
| 清空原内容 | w、w+ |
| 不适用(直接报错) | x、x+ |
记忆口诀(帮你快速记住)
r 家族报错,w/a/x 家族创建
w 家族会清空,a 家族写末尾,r 家族读开头
-
r(read):读,不存在就报错
-
w(write):写,不存在就创建,存在就清空
-
a(append):追加,不存在就创建,存在就追加到末尾
-
x(exclusive):排他创建,不存在就创建,存在就报错
-
加号
+:表示同时具备读写能力
一图流总结(逻辑关系)
文件打开模式
│
┌───────────────┼───────────────┐
│ │ │
r 家族 w 家族 x 家族
(不存在报错) (不存在创建) (存在就报错)
│ │ │
r(只读) w(清空写) x(排他创建)
r+(读写) w+(清空读写) x+(排他读写)
│
a 家族
(不存在创建)
│
a(追加写)
a+(追加读写)