str.split()默认按任意空白切且过滤空字符串,但未strip或含\n会导致空列表;文件读写须指定encoding和模式('a'追加、'w'清空);json只支持基础类型;必须用with确保关闭文件。

Python 里用 str.split() 切分单词时,为什么空行或多余空格会崩掉?
因为 str.split() 默认按任意空白字符(包括换行、制表、多个空格)切,且自动过滤空字符串——但如果你读文件后没清理末尾换行,或者用 readlines() 留下 '\n',再切就可能得到空列表或意外分割。
- 读文件优先用
read().splitlines(),它天然去掉每行末尾\n,不产生空行 - 如果必须用
split(),记得先strip():例如line.strip().split(),避免首尾空格干扰 - 处理用户输入的单词行(比如“apple, banana, cherry”),别硬套空格切,改用
split(',')再逐个strip()
用 open() 写单词本时,中文乱码或覆盖旧内容怎么办?
根本原因是没指定编码和打开模式。Windows 默认用 gbk,而 Python 3 默认用 utf-8;'w' 模式每次打开都会清空文件,不是追加。
- 写入必须显式声明编码:
open('words.txt', 'w', encoding='utf-8') - 追加新单词用
'a'模式,不是'w';'a'自动定位到末尾,不会误删历史 - 如果文件已存在且是 gbk 编码(比如从旧记事本直接拖进来的),读的时候得写
encoding='gbk',否则报UnicodeDecodeError
用 json.dump() 存单词本结构体,为什么老是报 TypeError: Object of type set is not JSON serializable?
因为你把单词存成了 set 或其他非基础类型(比如自定义类、函数),而 json 只认 dict、list、str、int、float、bool、None 这几种。
- 单词本推荐用
list[dict]结构,例如[{"word": "apple", "note": "水果"}, ...],直接json.dump()就行 - 如果想去重,先用
list(set(...))转回 list,别让 set 进 json 流程 - 写入时加
ensure_ascii=False,否则中文变\u4f60\u597d;加indent=2方便人眼查看
小文件读写要不要用 with?不用会出什么问题?
要,而且必须用。with 不是为了“更优雅”,是防止忘记 close() 导致文件句柄卡住——尤其在异常退出、或频繁读写时,系统可能报 OSError: [Errno 24] Too many open files。
- 正确写法只有这一种:
with open('words.txt', 'r', encoding='utf-8') as f: words = f.read().splitlines() - 千万别写
f = open(...); ...; f.close(),中间抛异常就漏关了 - 即使只是读一次小文件,也不代表安全——Windows 对文件锁敏感,没关掉就可能被别的程序(比如记事本)打不开
with 看似多写两行,但它挡掉的 bug,比你花十分钟调试还多。










