查看全课大纲(第 9 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

输入函数 `input()` 和文件读取 `open()` 怎么用?

约 14 分钟

输入函数 input() 和文件读取 open() 怎么用?

小象实战讲义 · Python 编程从入门到实践

在编写程序时,我们经常需要从外部获取数据,比如让用户输入信息,或者读取磁盘上的文件。本节将学习 Python 中最基础的两种输入方式:从键盘读取用户输入和从文件中读取数据。这是程序与外界交互的第一步,也是后续处理数据的基础。

💡 核心导读

  • input() 函数:用于从控制台(命令行)读取用户的键盘输入,并以字符串形式返回。
  • open() 函数:用于打开一个文件,返回一个文件对象,后续可通过该对象读取文件内容。
  • 文件读取方法:read()、readline()、readlines() 以及直接迭代文件对象,各有不同的适用场景。
  • with 语句:推荐的文件操作方式,能自动管理文件的打开和关闭,避免资源泄露。
  • 常见错误:忘记处理 input() 返回的字符串类型,以及忘记关闭文件句柄。

从键盘获取输入:input()

input() 是 Python 内置的函数,用于从标准输入(通常是键盘)读取一行文本。

基本用法

调用 input() 时,可以传入一个字符串参数作为提示信息。程序会先打印这个提示,然后等待用户输入。用户输入内容并按回车后,input() 会将输入的内容作为字符串返回。

# 原程序:user_str = input("请输入:")
user_str = "你好"  # 本节用固定值模拟键盘输入,实际运行时改回 input()
print("你输入的内容是: ", user_str)

# input() 读入的是字符串;假设用户输入了 25
age_str = "25"  # 原程序:age_str = input("请输入你的年龄:")
age_int = int(age_str)  # 使用 int() 转换为整数 25
print("明年你就 {} 岁了。".format(age_int + 1))
你输入的内容是:  你好
明年你就 26 岁了。

重要特性:返回值是字符串

无论用户输入的是数字还是其他内容,input() 返回的始终是字符串(str)类型。如果你需要进行数学计算,必须先将字符串转换为整数或浮点数。上面的第二个例子先把 "25" 转成整数 25,才能做加法。

从文件获取输入:open() 与文件读取

当数据量较大或需要持久化时,我们通常将数据存储在文件中。Python 使用 open() 函数来打开文件。

打开文件:open()

open() 函数的基本语法是 open(文件名, 模式)。它返回一个“文件对象”,你可以把它想象成程序与磁盘上那个文件之间的一个连接通道(专业术语叫“文件句柄”或“文件描述符”)。

文件对象 = open(文件名, 模式)
  • 文件名:字符串,表示要打开的文件的路径,如 "./data.txt"。
  • 模式:字符串,指定打开文件的目的。本节读取文件使用 'r',表示 read(只读);打开文件的其他模式会在下一节“输出”中继续接触。

为满足讲义代码可复制即跑、且不落盘写文件,下面的示例用内存流(io.StringIO)模拟文件;真实项目中把 StringIO(...) 换成 open('文件路径', ...) 即可。

读取文件的几种方法

获得文件对象后,有几种方法可以读取其内容。下面把 read()、readline()、readlines() 和直接迭代放在同一个例子里对照。

  • read():一次性把文件全部内容读成一个字符串,适合较小的文件。
  • readline():每次只读一行(行尾带 \n),适合大文件逐行处理。
  • readlines():把所有行读成一个列表,列表的每个元素是一行(同样带 \n)。
  • 直接迭代文件对象:for line in f:,逐行处理,写法最简洁。
import io

# 用 StringIO 模拟文件内容,避免依赖本地文件
file_content = (
    "date,s1,s2,s3,s4,s5\n"
    "05-21,27.93,28.18,29.39,40.52,26.26\n"
    "05-22,58.08,50.61,51.62,48.55,54.03"
)

print("read() 一次性读取:")
f = io.StringIO(file_content)
print(f.read())
f.close()

print("readline() 逐行读取:")
f = io.StringIO(file_content)
print("第一次:", f.readline().strip())
print("第二次:", f.readline().strip())
f.close()

print("readlines() 读到列表:")
f = io.StringIO(file_content)
lines = f.readlines()
print("行数:{}".format(len(lines)))
print("第一行:{}".format(lines[0].strip()))
f.close()

print("for 循环逐行读取:")
f = io.StringIO(file_content)
for line in f:
    print(line.strip())
f.close()
read() 一次性读取:
date,s1,s2,s3,s4,s5
05-21,27.93,28.18,29.39,40.52,26.26
05-22,58.08,50.61,51.62,48.55,54.03
readline() 逐行读取:
第一次: date,s1,s2,s3,s4,s5
第二次: 05-21,27.93,28.18,29.39,40.52,26.26
readlines() 读到列表:
行数:3
第一行:date,s1,s2,s3,s4,s5
for 循环逐行读取:
date,s1,s2,s3,s4,s5
05-21,27.93,28.18,29.39,40.52,26.26
05-22,58.08,50.61,51.62,48.55,54.03

必须关闭文件:close()

操作系统对同时打开的文件数量有限制。打开文件后,必须调用 close() 方法来关闭文件,释放系统资源。否则可能导致“文件描述符泄露”,影响程序稳定性。

f = open("somefile.txt", "r")
# ... 进行文件操作 ...
f.close()  # 操作完成后,必须关闭

使用 with 语句自动管理文件

手动调用 open() 和 close() 比较繁琐,且如果在 close() 之前发生异常,文件可能无法正常关闭。Python 提供了 with 语句(上下文管理器)来优雅地解决这个问题。

with 语句的用法

with 语句会在其代码块开始前自动打开文件,并在代码块执行完毕后(无论是否发生异常)自动关闭文件。

import io
# 模拟文件内容
file_content = "这是文件内容"
# 使用 with 语句
with io.StringIO(file_content) as f:  # 相当于 f = io.StringIO(file_content)
    data = f.read()
    print("读取的内容: {}".format(data))
# 退出 with 代码块后,文件会自动关闭,无需调用 f.close()
读取的内容: 这是文件内容

使用 with 语句是文件操作的最佳实践,它能确保资源被正确释放,让代码更简洁、更安全。

📝 动手练一练

  1. 模拟用户注册:编写一段代码,提示用户输入用户名和年龄,然后打印一条欢迎信息,格式为“欢迎 [用户名],您今年 [年龄] 岁。”。请使用 input() 的模拟方式(即使用固定字符串)。
👉 点击查看参考答案

思路:使用两个变量分别接收用户名和年龄的输入(模拟)。注意年龄输入是字符串,需要转换为整数才能用于后续计算或格式化。最后使用 print 进行格式化输出。

# 模拟用户输入
username = "张三"  # 原程序:username = input("请输入用户名:")
age_str = "20"     # 原程序:age_str = input("请输入年龄:")

# 将年龄字符串转换为整数
age = int(age_str)

# 打印欢迎信息
print("欢迎 {},您今年 {} 岁。".format(username, age))
欢迎 张三,您今年 20 岁。
  1. 统计文件行数:假设你有一个多行的字符串(模拟一个文件),请使用 with 语句和迭代文件对象的方式,计算这个“文件”总共有多少行。
👉 点击查看参考答案

思路:用 io.StringIO 将字符串模拟为文件。在 with 语句中迭代文件对象,每迭代一次计数器加一。迭代完成后,计数器的值就是行数。

import io

# 模拟一个多行文件的内容
multi_line_content = """第一行
第二行
第三行
这是第四行
最后一行"""

line_count = 0
with io.StringIO(multi_line_content) as f:
    for line in f:
        line_count += 1

print("文件总共有 {} 行。".format(line_count))
文件总共有 5 行。

常见错误

错误写法现象或报错原因正确写法
result = input("输入数字: ") + 10TypeError: can only concatenate str (not "int") to strinput() 返回的是字符串,不能直接与整数相加。result = int(input("输入数字: ")) + 10
只 open 不 close,且未使用 with程序运行一段时间后可能报 OSError: [Errno 24] Too many open files打开的文件句柄未释放,达到系统上限。使用 with open(...) as f: 或确保在 finally 块中调用 f.close()。
对同一文件对象连续调用 read()第二次 read() 返回空字符串。第一次 read() 后,文件指针已移动到末尾。如需再次读取,需重新打开文件。
直接 open("不存在的文件.txt", "r")FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'以读模式打开时,文件必须已经存在,否则会抛异常。用 try/except FileNotFoundError 捕获后提示用户。

小结

  1. input() 函数用于从控制台获取用户输入,返回值永远是字符串类型。
  2. 使用 int() 或 float() 可以将数字字符串转换为数值类型进行计算。
  3. open() 函数用于打开文件,需指定文件名和模式(如 'r' 用于读取)。
  4. 读取文件内容有多种方法:read()(全部)、readline()(单行)、readlines()(所有行列表)以及直接迭代文件对象。
  5. 文件操作完成后,必须调用 close() 方法关闭文件以释放系统资源。
  6. 推荐使用 with open(...) as f: 语句,它可以自动管理文件的打开和关闭,代码更简洁安全。

📋 行动清单

  • 在本地 Python 环境中,将讲义中所有使用固定值模拟 input() 的代码,改回真正的 input() 函数并运行,体验交互过程。
  • 尝试用 'w' 模式打开一个文件,写入一些内容,再用 'r' 模式打开并读取,验证写入和读取的过程。
  • 分别用 read()、readlines() 和 for 循环迭代三种方式读取同一个文本文件,观察输出结果有何异同。

—— 小象教研组

配套资料 · 直接下载

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

  • 第1章代码包:输入输出_样例代码(含1 个 Notebook、3 个数据/其他文件)
    ZIP · 2KB
    下载