未指定file参数时print函数为何输出至文件?——基于fileinput.inplace场景的技术问询
为啥
fileinput的inplace=1能让print直接写入目标文件? 这问题问得好!我当初第一次用fileinput的inplace参数时也一脸懵——明明没手动改sys.stdout,怎么print就直接写到文件里了?其实是fileinput模块在幕后悄悄搞了点小动作:
核心原理:inplace参数的幕后操作
当你设置inplace=True(1是它的等价布尔值)时,fileinput会帮你完成以下几步:
- 打开目标文件的临时副本,作为输出的“秘密目标”
- 偷偷把
sys.stdout重定向到这个临时文件上——这个操作是模块内部完成的,不需要你手动赋值,所以你完全察觉不到 - 当你退出
with代码块时,fileinput会自动把原来的文件替换成这个临时文件,同时把sys.stdout恢复成原来的控制台输出
对应你的代码来理解
看你这段代码:
import fileinput # 假设filename是你的目标文件路径 with fileinput.input(filename, inplace=1) as file: for line in file: print("// " + line)
这里的print默认是输出到sys.stdout,但此时sys.stdout已经被fileinput换成了临时文件,所以所有print的内容都会写到这个临时文件里,最后替换原文件,自然不会在控制台输出任何内容。
小技巧:想同时输出到控制台怎么办?
如果想在修改文件的同时,看到控制台的输出,可以先保存原始的sys.stdout,然后在print的时候同时写入两个地方:
import fileinput import sys original_stdout = sys.stdout filename = "your_file.txt" with fileinput.input(filename, inplace=1) as file: for line in file: modified_line = "// " + line print(modified_line, end='') # 写入临时文件(最终替换原文件) print(modified_line, end='', file=original_stdout) # 输出到控制台
加end=''是因为读取的line本身已经包含换行符了,避免重复输出换行导致空行。
内容的提问来源于stack exchange,提问作者Martin Neumann
相关产品推荐
相关产品推荐

