You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:52:27