【Python】文件输入输出
1. 标准 I/O vs 文件 I/O
平时你在电脑上自己运行代码时:
- 标准输入 (Standard Input):代码运行到
input()时会停下来,等你用键盘敲字回车。 - 标准输出 (Standard Output):代码运行到
print()时,结果会直接显示在**屏幕(控制台)**上。
但在算法竞赛或者学校的评测系统里,评测机要在几秒钟内测试成千上万份代码,不可能有人工坐在那里对着你的程序敲键盘输入测试数据。
所以,平台会提前把所有的测试用例写在一个文本文档里(比如题目要求的 input.txt)。评测要求你的程序:
- 不要等键盘输入,直接去读取
input.txt里的数据。 - 不要打印在屏幕上,把算出来的结果直接写进
output.txt里。 评测机最后只需要对比你的output.txt和标准答案文本文档是否完全一致,就能判断你对不对。
2. 那几行代码到底在干嘛?
在 C 语言里,如果要解决这种文件重定向问题,通常会用到 freopen 函数。在 Python 里,原理非常相似,就是通过操作 sys 模块来实现流的替换。
1 | import sys |
import sys:引入 Python 的系统接口模块,用来和底层操作系统打交道。sys.stdin:这就是 Python 里的“标准输入流”。它原本的默认接口是连接着键盘的。open('input.txt', 'r'):打开当前目录下的input.txt文件,'r'代表 read(只读模式)。sys.stdin = ...:这一步是个“偷梁换柱”的操作。相当于你把原来插在键盘上的数据线拔了下来,插到了input.txt这个文件上。
同理,sys.stdout = open('output.txt', 'w') 就是把原本插在显示器上的输出数据线拔下来,插到了 output.txt 文件上,'w' 代表 write(写入模式)。
3. 为什么用这种写法?
这种写法最大的好处就是不用修改核心业务代码。
你只需要在代码最开头加上这三行,剩下的部分该怎么写 input() 就怎么写,该怎么写 print() 就怎么写。Python 在底层遇到 input() 时,顺着线摸过去,发现连接的不是键盘而是文件,就会自动从文件里读一行数据出来;遇到 print() 时,也会默默地把数据写进文本里。
这种把输入输出的“源头”和“终点”偷偷换掉的技术,叫做I/O 重定向。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 王总的博客!



