这个主题考什么
- 根据任务选择 r、w、a 和二进制模式。
- 使用 with 块,让文件在出错时也能关闭。
- 读取行和写入文本时,不丢失换行符。
常见错误
- 想追加却用了 w,结果把原文件截断。
- 内容不是 ASCII 时,打开文本文件却不指定编码。
- 忘记 readlines 会在每一行末尾保留换行符。
样题
从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。
-
1. 小明写订单到文件 open("订单.txt", "w"),"w" 表示什么?
显示答案
答案
B. 写入(覆盖原内容)解析: w 在 open 执行时就截断文件,旧流水在第一行写入前已经清空;要保留旧内容只能改用 a,否则每次打开都从零开始。
-
2. 小明写下一行后,用另一个程序打开同一文件却看不到内容。哪个调用能把缓冲刷进磁盘?
显示答案
答案
A. f.flush()解析: write() 只是把文本放进进程缓冲;flush() 才交给操作系统,在那之前别的程序看不到。close() 也会刷新,但只在块结束那一刻。
-
3. 哪种结构能在代码块内发生异常时仍然关闭文件?
显示答案
答案
B. with 语句解析: 这里只有 with 块绑定了清理动作:异常还在传播时,__exit__ 就会调用 close(),循环和 match 都不管这个。
-
4. f.read() 和 f.readlines() 的主要区别是?
显示答案
答案
B. 前者返回整段字符串,后者返回行列表解析: read() 把全文作为一个字符串返回;readlines() 按换行切分且保留换行符,返回列表,readline() 只取一行。
-
5. 小明读写中文菜单文件,为防乱码要指定 open(..., encoding=___)
显示答案
答案
utf-8解析: 不写 encoding 会用平台默认值,Windows 上常是 GBK;显式写 utf-8 才按写入时的字节解码。
-
6. 在文件末尾追加内容,模式填什么?
with open('orders.txt', '____', encoding='utf-8') as f: f.write('new\n')显示答案
答案
a解析: a 在末尾追加,之前的订单得以保留。w 会先清空,r 不允许写入。 文件不存在时 a 会新建,第一次追加不用特殊处理。
-
7. 在数据行之前先写表头,空里填哪个方法?
writer = csv.DictWriter(f, fieldnames=['name', 'price']) writer.____()显示答案
答案
writeheader解析: writeheader() 把 fieldnames 写成第一行。不写的话文件从数据开始,之后 DictReader 会把第一条数据当表头。
-
8. pathlib 拆路径,三个属性分别是什么?
from pathlib import Path p = Path("data/orders.csv") print(p.name, p.suffix, p.parent)显示答案
答案
orders.csv .csv data解析: Path 只切字符串不碰磁盘:name 是带后缀的文件名,suffix 含点号,parent 是 data。
-
9. 内存文件里有两行小票,读取后行数是多少?
import io f = io.StringIO('拿铁,18\n美式,15\n') print(len(f.readlines()))显示答案
答案
2解析: readlines() 每个以换行结尾的行算一项,'latte,18\n' 与 'americano,15\n' 共 2 项。 readlines() 还会把整个文件读进内存,日志变大后要留意。
-
10. 写入内存文件后读出的内容是什么?
import io f = io.StringIO() f.write('拿铁,18') print(f.getvalue())显示答案
答案
拿铁,18解析: StringIO 把写入的文本留在进程里,不落磁盘;getvalue() 原样返回,也不加换行,单元测试里很好用。
常见问题
为什么用 with open 而不是手动 open 和 close?
with 块会自动关闭文件,即使块内发生异常也会关闭。
w 模式会对已有文件做什么?
它会先截断文件。要追加用 a;要更新但不截断可以用 r+。
继续保持练习节奏。
完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。