You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Jupyter Notebook中修改sys.stdin以用input()读取文件内容?

解决Jupyter Notebook中重定向sys.stdin后input()仍弹出输入框的问题

你遇到的这个问题其实是Jupyter Notebook(以及IPython环境)的特性导致的——这里的input()函数并不是直接依赖sys.stdin实现的,它是环境专门封装的交互输入工具,所以直接替换sys.stdin并不会让它读取文件内容,还是会弹出输入框。

给你几个可行的解决方案:

方案1:直接读取文件内容(简单直接)

如果只是需要读取文件里的内容,完全可以绕过input(),直接操作文件对象:

# 推荐用with语句自动管理文件关闭
with open("input.in", "r", encoding="utf-8") as file:
    # 读取第一行(对应一次input()的效果)
    val = file.readline().strip()
    # 如果需要读取全部内容,用file.read()
    # all_content = file.read()
print(val)

方案2:自定义input()函数模拟文件读取

如果你的代码里有大量input()调用,不想逐个修改,可以自己实现一个替代input()的函数,让它从预读的文件内容里逐行取数据:

# 先把文件所有行读入列表,去掉换行符
with open("input.in", "r", encoding="utf-8") as f:
    input_buffer = [line.rstrip('\n') for line in f]
current_line = 0

def file_input():
    global current_line
    if current_line >= len(input_buffer):
        raise EOFError("没有更多输入内容了")
    line = input_buffer[current_line]
    current_line += 1
    return line

# 替换全局的input函数
input = file_input

# 现在调用input()就会读取文件里的内容了
val1 = input()
print(val1)
val2 = input()
print(val2)

方案3:用%run命令执行脚本

如果你的代码原本是作为独立脚本写的,不想修改代码,可以把代码保存成.py文件(比如test.py),然后在Notebook里用IPython的魔术命令%run来执行:

%run test.py

这种方式会在接近常规Python脚本的环境里运行代码,你的sys.stdin替换逻辑就能正常生效,不会弹出输入框。

内容的提问来源于stack exchange,提问作者Seljuk Gulcan

火山引擎 最新活动