鱼C论坛

 找回密码
 立即注册
查看: 2355|回复: 3

[技术交流] Python 版 freopen

[复制链接]
发表于 2021-1-2 19:36:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python freopen


众所周知,Python 的 sys 库里面有两个东西,分别是 sys.stdin 和 sys.stdout。

看名字就知道它俩是干啥的8,一个输入,一个输出。

他俩本质是变量,所以是可以改变值的。比如,把 print 的输出定向到文件中,有两种方法:

第一种:
print("Hello world!", file = open("我是一个文件.txt", "w", encoding = "utf-8"))

第二种:
import sys

sys.stdout = open("我是一个文件.txt", "w", encoding = "utf-8")
print("Hello world!")

明显可以发现,后者在使用时不需要设置 file 参数,所以更加方便。

从文件里读取内容并传给 input 函数也是一个道理:
import sys

sys.stdin = open("我是一个文件.txt", "r", encoding = "utf-8")
s = input()
print(s)

假设文件真的存在且有内容,运行一下,可以发现,打印出了文件第一行的内容。

所以不难发现,input 函数的本质其实是:
import sys

def input(prompt):
    print(prompt, end = "")
    return sys.stdin.readline().strip() # strip 是为了删除行尾附带的换行符

综上所述,可以写出 freopen 函数原型:
import sys

# 由于使用 write 写入内容后,写入的内容会在缓冲区里而不是在文件里,所以使用 flush 刷新缓冲区
def print(*values, end = '\n', sep = ' ', file = sys.stdout, flush = True):
    file.write(sep.join(values) + end)
    if flush: file.flush()

def freopen(file, mode):
    # 由于 freopen 通常只用这两个文件模式,所以我就只写这俩了
    if mode == 'r':
        sys.stdin = open(file, mode, encoding = "utf-8")
    elif mode == 'w':
        sys.stdout = open(file, mode, encoding = "utf-8")

如果你想搭建一个程序评测系统的话,这个很好用!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 19:28:16 | 显示全部楼层
拿去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-17 18:56:52 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-18 08:41:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表