查看全课大纲(第 9 / 51 节)
- 1.Python 是什么?为什么值得学?
- 2.如何为 Python 编程准备一个“全家桶”环境?
- 3.Python 有哪几种执行方法?
- 4.行与缩进到底有什么用?
- 5.注释有什么用,怎么写?
- 6.变量:如何给数据起个好名字?
- 7.运算符的优先级和常见坑点是什么?
- 8.Python 中,数字和布尔值究竟有哪几种?
- 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
- 10.如何将程序的结果展示给用户或保存下来?
- 11.CSV 文件怎么读怎么写才方便?
- 12.列表是什么,如何创建和访问它?
- 13.列表的修改操作,有哪些方法?
- 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
- 15.判断语句:如何让程序根据条件做不同的事?
- 16.for 循环如何遍历序列中的元素?
- 17.while 循环什么时候才会停?
- 18.while 循环的结束条件,你写对了吗?
- 19.循环中途想提前结束,怎么办?
- 20.`break` 和 `continue` 到底有什么区别?
- 21.列表推导式如何让代码更简洁高效?
- 22.字符串怎么定义、拼接和操作?
- 23.元组:为什么定义单个元素时要加逗号?
- 24.集合(set)怎么用?如何快速去重和做集合运算?
- 25.字典是什么,为什么比列表更方便?
- 26.字典的增删改查与遍历,如何避免 KeyError?
- 27.函数里的变量,为什么有的能用有的不能用?
- 28.在函数内部修改全局变量,为什么有时不生效?
- 29.函数里能修改全局变量吗?返回值怎么用?
- 30.匿名函数:如何用 lambda 快速定义简单函数?
- 31.面向对象编程是什么,为什么需要它?
- 32.类中的方法和属性到底怎么定义和使用?
- 33.如何控制对对象内部属性和方法的访问?
- 34.异常发生时,程序会怎样继续执行?
- 35.如何组织代码:包和模块
- 36.`if __name__ == '__main__'` 到底有什么用?
- 37.如何用 IDE 的 Debug 功能排查程序错误?
- 38.Matplotlib 绘图的第一步该做什么?
- 39.Figure 是什么,如何设置图形尺寸?
- 40.如何自定义 Matplotlib 的坐标轴?
- 41.如何为图表添加图例,让不同曲线一目了然?
- 42.饼图怎么画才能直观展示数据占比?
- 43.如何用 Matplotlib 绘制散点图?
- 44.柱状图怎么画?
- 45.如何使用 Matplotlib 绘制等高线图?
- 46.如何在 Matplotlib 中绘制子图?
- 47.zip 函数如何把多个列表“打包”在一起?
- 48.如何给可迭代对象加上索引?
- 49.random 模块如何生成随机数?
- 50.math 模块怎么用?
- 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 语句是文件操作的最佳实践,它能确保资源被正确释放,让代码更简洁、更安全。
📝 动手练一练
- 模拟用户注册:编写一段代码,提示用户输入用户名和年龄,然后打印一条欢迎信息,格式为“欢迎 [用户名],您今年 [年龄] 岁。”。请使用
input()的模拟方式(即使用固定字符串)。
👉 点击查看参考答案
思路:使用两个变量分别接收用户名和年龄的输入(模拟)。注意年龄输入是字符串,需要转换为整数才能用于后续计算或格式化。最后使用 print 进行格式化输出。
# 模拟用户输入
username = "张三" # 原程序:username = input("请输入用户名:")
age_str = "20" # 原程序:age_str = input("请输入年龄:")
# 将年龄字符串转换为整数
age = int(age_str)
# 打印欢迎信息
print("欢迎 {},您今年 {} 岁。".format(username, age))欢迎 张三,您今年 20 岁。- 统计文件行数:假设你有一个多行的字符串(模拟一个文件),请使用
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("输入数字: ") + 10 | TypeError: can only concatenate str (not "int") to str | input() 返回的是字符串,不能直接与整数相加。 | 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 捕获后提示用户。 |
小结
input()函数用于从控制台获取用户输入,返回值永远是字符串类型。- 使用
int()或float()可以将数字字符串转换为数值类型进行计算。 open()函数用于打开文件,需指定文件名和模式(如'r'用于读取)。- 读取文件内容有多种方法:
read()(全部)、readline()(单行)、readlines()(所有行列表)以及直接迭代文件对象。 - 文件操作完成后,必须调用
close()方法关闭文件以释放系统资源。 - 推荐使用
with open(...) as f:语句,它可以自动管理文件的打开和关闭,代码更简洁安全。
📋 行动清单
- 在本地 Python 环境中,将讲义中所有使用固定值模拟
input()的代码,改回真正的input()函数并运行,体验交互过程。 - 尝试用
'w'模式打开一个文件,写入一些内容,再用'r'模式打开并读取,验证写入和读取的过程。 - 分别用
read()、readlines()和for循环迭代三种方式读取同一个文本文件,观察输出结果有何异同。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第1章代码包:输入输出_样例代码(含1 个 Notebook、3 个数据/其他文件)ZIP · 2KB