1. 标准 I/O vs 文件 I/O

平时你在电脑上自己运行代码时:

  • 标准输入 (Standard Input):代码运行到 input() 时会停下来,等你用键盘敲字回车。
  • 标准输出 (Standard Output):代码运行到 print() 时,结果会直接显示在**屏幕(控制台)**上。

但在算法竞赛或者学校的评测系统里,评测机要在几秒钟内测试成千上万份代码,不可能有人工坐在那里对着你的程序敲键盘输入测试数据。

所以,平台会提前把所有的测试用例写在一个文本文档里(比如题目要求的 input.txt)。评测要求你的程序:

  1. 不要等键盘输入,直接去读取 input.txt 里的数据。
  2. 不要打印在屏幕上,把算出来的结果直接写进 output.txt 里。 评测机最后只需要对比你的 output.txt 和标准答案文本文档是否完全一致,就能判断你对不对。

2. 那几行代码到底在干嘛?

在 C 语言里,如果要解决这种文件重定向问题,通常会用到 freopen 函数。在 Python 里,原理非常相似,就是通过操作 sys 模块来实现流的替换。

1
2
3
4
import sys

sys.stdin = open('input.txt', 'r')
sys.stdout = open('output.txt', 'w')
  • 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 重定向