将打印输出定向到.txt文件


75

有没有一种方法可以将所有打印输出保存到python中的txt文件中?可以说我的代码中有这两行,我想将打印输出保存到名为的文件中output.txt

print ("Hello stackoverflow!")
print ("I have a question.")

我希望output.txt文件包含

Hello stackoverflow!
I have a question.

Answers:


133

print一个file关键字参数,其中参数的值是文件流。我们可以使用以下open功能创建文件流:

print("Hello stackoverflow!", file=open("output.txt", "a"))
print("I have a question.", file=open("output.txt", "a"))

Python文档中有关print

所述file参数必须是与对象write(string)方法; 如果不存在或Nonesys.stdout将使用。

文档open

打开file并返回相应的文件对象。如果无法打开文件,OSError则引发。

" a "作为第二个参数open是指“追加” -换句话说,文件的现有内容不会被覆盖。如果要覆盖文件,请使用"w"


open但是,多次打开文件对于性能而言并不理想。理想情况下,您应该将其打开一次并命名,然后将该变量传递给printfile选项。您必须记住之后要关闭文件!

f = open("output.txt", "a")
print("Hello stackoverflow!", file=f)
print("I have a question.", file=f)
f.close()

还有一个语法上的捷径,即代码with块。这将在代码块末尾为您关闭文件:

with open("output.txt", "a") as f:
    print("Hello StackOverflow!", file=f)
    print("I have a question.", file=f)

感谢您的回答。一旦执行了第一行代码(第一次打印),相应的文件就会在实际执行第二次打印命令之前关闭。对?有没有办法在同一文件中一起打印很多东西,但要确保在执行第二轮循环之前文件已关闭?换句话说,我想在循环的每一轮中在同一文件中打印一些内容,并在两者之间关闭文件。谢谢,

9
@Allan,您应该使用with语句打开文件。这将创建一个file对象,并使其在整个块中保持打开状态,然后最后将其关闭。查看本文的第一个示例。让我知道您是否还有其他问题!
亚伦·克里斯蒂安森

谢谢,这已经很好地工作了。如何修改它以便在文件和控制台中都将其打印出来;而不只评估一次打印语句,以便耗时的功能只执行一次?
朱利安

@Julian,请检查此另一期中的“ print_both”功能stackoverflow.com/a/24206109/9492673以打印到控制台和输出文件
Tommaso Di Noto

19

您可以将标准输出重定向到文件“ output.txt”:

import sys
sys.stdout = open('output.txt','wt')
print ("Hello stackoverflow!")
print ("I have a question.")

9
有没有办法做到这一点并在控制台中显示文本?因此,同时打印到控制台和文件吗?我希望能够看到我所有的进度打印语句,因此我知道程序的执行位置和疑难解答语句,而且还可以将所有转储到文本文件中。
Korzak

1
@Korzak,请检查此另一期中的“ print_both”功能stackoverflow.com/a/24206109/9492673以打印到控制台和输出文件
Tommaso Di Noto

6

使用日志记录模块

def init_logging():
    rootLogger = logging.getLogger('my_logger')

    LOG_DIR = os.getcwd() + '/' + 'logs'
    if not os.path.exists(LOG_DIR):
        os.makedirs(LOG_DIR)
    fileHandler = logging.FileHandler("{0}/{1}.log".format(LOG_DIR, "g2"))
    rootLogger.addHandler(fileHandler)

    rootLogger.setLevel(logging.DEBUG)

    consoleHandler = logging.StreamHandler()
    rootLogger.addHandler(consoleHandler)

    return rootLogger

获取记录器:

logger = init_logging()

并开始记录/输出:

logger.debug('Hi! :)')

1

可以使用另一个变体...请确保稍后关闭文件

import sys
file = open('output.txt', 'a')
sys.stdout = file

print("Hello stackoverflow!") 
print("I have a question.")

file.close()

1

无需完全更新Python代码的另一种方法是通过控制台重定向

基本上,print()像往常一样使用Python脚本,然后从命令行调用脚本并使用命令行重定向。像这样:

$ python ./myscript.py > output.txt

您的output.txt文件现在将包含Python脚本的所有输出。

编辑:
解决评论;对于Windows,请将正斜杠更改为反斜杠。
(即.\myscript.py


这仅是Linux。当我爱linux时,有些人只使用Windoze -只要它不影响我,我对此就很好。
TheTechRobo36414519

0

假设我的输入文件是“ input.txt”,输出文件是“ output.txt”。

让我们考虑输入文件的详细信息:

5
1 2 3 4 5

码:

import sys

sys.stdin = open("input", "r")
sys.stdout = open("output", "w")

print("Reading from input File : ")
n = int(input())
print("Value of n is :", n)

arr = list(map(int, input().split()))
print(arr)

因此,这将从输入文件中读取,输出将显示在输出文件中。

有关更多详细信息,请参见https://www.geeksforgeeks.org/inputoutput-external-file-cc-java-python-competitive-programming/


-3

可以将函数的返回输出直接存储在文件中。

print(output statement, file=open("filename", "a"))

1
与已经接受的答案相比,您的回答有何不同?另外,您的代码甚至无法正常工作。错误的引号..
sertsedat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.