查看全课大纲(第 32 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

Python 怎么把密码保存到文件里?

约 16 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

还记得我们上一节写的密码强度检查器吗?它已经能判断你的密码是“强”还是“弱”了。但每次运行完,程序就“失忆”了,不记得你之前都试过哪些密码。这节,我们要给它装上一个“小本本”,让它把所有尝试过的密码和对应的强度都记录下来,保存到一个文件里。这样,你就能随时回顾自己的密码设置历史了。

💡 核心导读

  • 本节新增什么? 我们将学习如何让 Python 程序与文件“对话”,把密码和强度信息保存到硬盘上的一个文本文件里。
  • 文件是什么? 简单理解,就是硬盘上用来存东西的“小盒子”,比如你电脑里的文档、图片、视频。
  • 操作文件的“三步走”:打开文件 → 操作文件(读或写)→ 关闭文件。是不是很像“把大象放进冰箱”?
  • 一个重要的“小符号”:\n,它代表“换行”,能让我们的记录在文件里一条一条排列整齐。

给程序配个“记事本”

在上一节,我们的程序已经能循环检查密码强度了。现在,我们想增加一个功能:把每次用户输入的密码和它的强度等级,都保存到一个文件里。

这个文件就像一个记事本,程序每次运行都会在上面追加一条新记录。

本节我们只做一件事:学会如何打开一个文件、往里面写东西,然后安全地关上它。

认识一下“文件”

文件,其实就是存储在硬盘、U盘这些外部设备上的一堆数据或信息的集合。你电脑里的电影、音乐、PPT文档,都是文件。

我们今天要打交道的是最简单的一种:文本文件。它就像 Windows 系统里的“记事本”保存出来的文件,扩展名通常是 .txt。这种文件里只存储了字符编码,可以被最简单的文本编辑器直接打开和编辑。

说到编码,你可能听过 ASCII、Unicode、UTF-8 这些词。简单来说,编码就是把我们看到的文字、符号,转换成计算机能识别的二进制形式的过程。现在最常用的是 UTF-8 编码,它能很好地处理中文、英文等各种字符,我们这次就用它。

还有一个重要的概念:换行。在文本文件里,怎么表示“另起一行”呢?我们不可能在代码里真的敲一个回车键。Python 用 \n 这个特殊的组合来表示换行,它被称为“转义字符”。\n 会被当作一个整体看待,代表换行操作。

文件操作“三步走”

用 Python 操作文件,就像把大象放进冰箱一样,只需要三步:

  1. 打开文件:建立程序和文件之间的“连接通道”。
  2. 操作文件:通过这个“通道”读数据或者写数据。
  3. 关闭文件:断开“连接通道”,释放资源。

想象一下,你的代码和硬盘上的文件原本是独立的。open() 函数就像一座桥,把它们连接起来。之后你就能在代码里指挥文件了。操作完了,一定要用 close() 把桥拆掉,不然这个文件会一直被你的程序“占着”,别人(或其他程序)就没法用了。

第一步:打开文件

我们用 open() 函数来打开文件。它至少需要两个信息:

  • 文件名:你想打开哪个文件(可以包含路径)。
  • 打开模式:你打算对这个文件做什么。

常见的打开模式有:

模式含义
'r'只读。文件必须存在,否则报错。
'w'只写。如果文件不存在,会自动创建;如果文件已存在,会清空原有内容从头写。
'a'追加写。如果文件不存在,会自动创建;如果文件已存在,会在文件末尾追加新内容,不会清空旧的。
'r+'可读可写。

我们要记录每次的密码,显然应该用 'a'(追加)模式,这样历史记录才不会丢失。

第二步:写操作

打开文件后,我们得到一个“文件对象”(比如我们把它赋值给变量 f)。通过这个对象,我们可以调用 .write() 方法,把一段文本(字符串)写入文件。

第三步:关闭文件

操作完成后,调用文件对象的 .close() 方法,关闭文件。

动手:让密码检查器学会“记笔记”

现在,我们把这三步融入到我们的密码检查程序中。我们想在每次用户输入密码后,无论密码是否合格,都把这次尝试记录下来。

下面是完整的 3.0 版本程序。注意,我们把整个程序写在一个代码块里,确保你能直接复制运行。

"""
    作者:小象教研组
    功能:判断密码强度(3.0版 - 保存记录到文件)
    版本:3.0
    新增功能:将每次尝试的密码及其强度保存到文本文件中
"""

def check_number_exist(password_str):
    """
        判断字符串中是否含有数字
    """
    has_number = False
    for c in password_str:
        if c.isnumeric():
            has_number = True
            break
    return has_number

def check_letter_exist(password_str):
    """
        判断字符串中是否含有字母
    """
    has_letter = False
    for c in password_str:
        if c.isalpha():
            has_letter = True
            break
    return has_letter

def main():
    """
        主函数
    """
    try_times = 5  # 最多尝试5次

    while try_times > 0:
        # 原程序这里使用 input(),为了直接运行,我们用一个固定值模拟输入
        # password = input('请输入密码:')
        password = 'Test1234'  # 你可以修改这个值来测试不同密码

        # 密码强度初始为0
        strength_level = 0

        # 规则1:密码长度大于8
        if len(password) >= 8:
            strength_level += 1
        else:
            print('密码长度要求至少8位!')

        # 规则2:包含数字
        if check_number_exist(password):
            strength_level += 1
        else:
            print('密码要求包含数字!')

        # 规则3:包含字母
        if check_letter_exist(password):
            strength_level += 1
        else:
            print('密码要求包含字母!')

        # ========== 本节新增的核心代码:文件操作三步走 ==========
        # 1. 打开文件('a'模式表示追加,不会覆盖之前的内容)
        f = open('password_record.txt', 'a', encoding='utf-8') # 指定UTF-8编码以支持中文

        # 2. 操作文件:写入一条记录
        # 使用格式化字符串,记录"密码"和"强度",末尾加\n换行
        record = '密码:{}, 强度:{}\n'.format(password, strength_level)
        f.write(record)

        # 3. 关闭文件
        f.close()
        # ==================================================

        # 判断本次密码是否合格
        if strength_level == 3:
            print('恭喜!密码强度合格!')
            break  # 合格则跳出循环
        else:
            print('密码强度不合格!')
            try_times -= 1  # 尝试次数减1

        print()  # 输出空行,让显示更清晰

    if try_times <= 0:
        print('尝试次数过多,密码设置失败!')

# 运行主函数
main()

运行上面的程序,它会在你代码文件所在的同一个文件夹里,生成一个名为 password_record.txt 的新文件。用记事本打开它,你会看到类似这样的内容:

恭喜!密码强度合格!

代码解读:

  • open('password_record.txt', 'a', encoding='utf-8'):以追加('a')模式打开(或创建)password_record.txt 文件,并指定使用 utf-8 编码,这样可以正确保存和显示中文。
  • '密码:{}, 强度:{}\n'.format(password, strength_level):这是一个格式化字符串。{} 是占位符,.format() 方法会将括号里的变量 password 和 strength_level 按顺序填充进去。末尾的 \n 确保每次记录都独占一行。
  • f.write(record):将组装好的字符串 record 写入文件。
  • f.close():千万别忘了这一步!它就像离开房间要关门一样重要。

试试看: 你可以把 password = 'Test1234' 这行注释掉,取消下一行 password = input('请输入密码:') 的注释,然后多次运行程序,输入不同的密码。再打开 password_record.txt 文件,看看你的“密码尝试史”是不是都完整地保存在里面了?

还能做得更好吗?

现在文件里记录的强度是数字(0, 1, 2, 3),对用户来说不够直观。我们可以在保存前,把数字转换成“弱”、“中”、“强”这样的文字描述。这个优化就留给你作为练习啦!

📝 动手练一练

  1. 优化显示:修改上面的程序,使得保存到文件里的“强度”不是数字,而是文字描述。例如:强度3为“强”,强度2为“中”,强度1为“较弱”,强度0为“弱”。最终文件里的一行记录应该像这样:密码:abc123, 强度:中。
👉 点击查看参考答案

思路:在写入文件之前,根据 strength_level 的值,用一个 if...elif...else 判断语句,将其映射为对应的中文描述字符串。

关键代码片段(放在 while 循环内、f.write() 之前,替换原来直接用 strength_level 的写法;其余代码沿用 3.0):

# 在写入文件之前,先把强度数字转换成文字
if strength_level == 3:
    level_text = '强'
elif strength_level == 2:
    level_text = '中'
elif strength_level == 1:
    level_text = '较弱'
else:  # strength_level == 0
    level_text = '弱'

# 然后用 level_text 组装记录并写入
record = '密码:{}, 强度:{}\n'.format(password, level_text)
f.write(record)

将这段判断逻辑放在 f.write() 之前,替换掉原来直接使用 strength_level 的部分即可。

  1. 模式体验:将程序中 open() 函数的模式从 'a' 改成 'w',然后运行程序几次。每次运行后都打开 password_record.txt 文件观察,你发现了什么?这说明了 'w' 模式和 'a' 模式最主要的区别是什么?
👉 点击查看参考答案

发现:每次以 'w'(只写)模式运行程序后,password_record.txt 文件里都只保留了最近一次运行所写入的记录,之前的记录都被清空了。

区别:'w' 模式在打开文件时,如果文件已存在,会清空其所有原有内容,然后从头开始写。而 'a'(追加)模式则会在文件末尾添加新内容,保留所有旧内容。因此,对于需要保存历史记录的场景(如日志、本次的密码记录),必须使用 'a' 模式。

本章小结

恭喜!你的密码检查器现在不仅会判断,还会“记笔记”了。我们通过一个非常实用的功能,自然而然地学会了 Python 文件操作的核心心法。

💡 核心收获

  • 文件是持久化存储数据的基本单位,文本文件(.txt)是最简单的一种。
  • 操作文件必须遵循“三步走”:打开 → 操作 → 关闭。open() 和 close() 是必须成对出现的好伙伴。
  • 打开模式是关键:'r' 读,'w' 写(会清空),'a' 追加(推荐用于记录日志)。
  • 换行符 \n 是一个重要的转义字符,用于在文本中表示另起一行。

📋 行动清单

  • 运行本节代码,确认在文件夹中成功生成了 password_record.txt 文件。
  • 完成“动手练一练”的第一题,让你的密码记录本显示更友好。
  • 思考一下:你还能用这个“保存到文件”的功能,为你之前做过的哪个小项目(比如 BMR 计算器、52周存钱计划)添加一个“历史记录”功能?

我们刚刚学会了如何把数据从程序“写”到文件里。下一节,我们将学习反过来,如何把文件里保存的数据“读”回到程序里进行处理。让你的程序真正学会“翻阅”自己的记忆!

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第7章代码包:判断密码强弱(含全部版本 6 个 .py)
    ZIP · 5KB
    下载
看图文没弄懂?展开看本节视频讲解(约 16 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)