12

python中有什么东西可以复制C或C++中freopen()的功能吗?准确地说,我想复制以下功能:

freopen("input.txt","r",stdin);

freopen("output.txt","w",stdout);

然后将相同的(标准)函数用于文件 I/O 的控制台 I/O。有任何想法吗?

4

5 回答 5

10

sys.stdout只是file对象,因此,您可以将其重新打开到另一个目的地

out = sys.stdout
sys.stdout = open('output.txt', 'w')
// do some work
sys.stdout = out

out仅用于sys.stdout在下班后将目的地恢复为默认值(如 Martijn Pieters 建议的那样 - 您可以使用 来恢复它sys.__stdout__,或者根本不恢复,如果您不需要它)。

于 2013-05-16T08:16:43.880 回答
7

尝试这个:

import sys
sys.stdin = open('input.txt', 'r') 
sys.stdout = open('output.txt', 'w')

文本文件是不言自明的。您现在可以在 Sublime Text 或任何其他文本编辑器上运行此代码。

于 2018-01-20T13:58:58.587 回答
6

如果您在 *nix 平台上工作,您可以编写自己的freopen.

def freopen(f,option,stream):
    import os
    oldf = open(f,option)
    oldfd = oldf.fileno()
    newfd = stream.fileno()
    os.close(newfd)
    os.dup2(oldfd, newfd)

import sys
freopen("hello","w",sys.stdout)

print "world"
于 2013-05-16T08:26:46.687 回答
4

您可能还想查看临时重定向的contextmanager装饰器:contextlib

from contextlib import contextmanager 
import sys 

@contextmanager
def stdout_redirected(new_stdout):
    save_stdout = sys.stdout
    sys.stdout  = new_stdout
    try:
        yield
    finally:
        sys.stdout = save_stdout

例子:

 with open(filename, "w") as f:
     with stdout_redirected(f):
         print "Hello"
于 2013-05-16T08:50:34.833 回答
0

这应该有助于:

import sys

def freopen(filename, mode):
    if mode == "r":
        sys.stdin = open(filename, mode)

    elif mode == "w":
        sys.stdout = open(filename, mode)

# ---- MAIN ----

freopen("input.txt", "r")
freopen("output.txt", "w")
于 2018-02-08T08:10:05.990 回答