Python版本的freopen()

时间:2013-05-16 08:12:08

标签: c++ python c file file-io

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

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

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

然后对文件I / O使用相同(标准)的控制台I / O函数。有什么想法吗?

5 个答案:

答案 0 :(得分:9)

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__恢复它,或者根本不恢复,如果你不这样做的话需要它。)

答案 1 :(得分:5)

如果您正在使用* 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"

答案 2 :(得分:4)

试试这个:

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

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

答案 3 :(得分:3)

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

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 opened(filename, "w") as f:
     with stdout_redirected(f):
         print "Hello"

答案 4 :(得分: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")