【问题标题】:Directing print output to a .txt file将打印输出定向到 .txt 文件
【发布时间】:2016-08-02 23:09:24
【问题描述】:

有没有办法将所有打印输出保存到 python 中的 txt 文件?假设我的代码中有这两行,我想将打印输出保存到名为 output.txt 的文件中。

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

我希望 output.txt 文件包含

Hello stackoverflow!
I have a question.

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

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

    来自Python documentation about print

    file 参数必须是具有write(string) 方法的对象;如果它不存在或None,将使用sys.stdout

    还有the documentation for 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)
    

    【讨论】:

    • 感谢您的回答。一旦执行了第一行代码(第一次打印),相应的文件就会在实际执行第二个打印命令之前关闭。正确的?有没有办法在同一个文件中打印很多东西,但要确保文件在第二轮循环执行之前关闭?换句话说,我想在循环周围的每一轮中在相同的文件中打印一些东西,并在它们之间打印一些关闭文件。谢谢,
    • @Allan,您应该使用with 语句打开文件。这将创建一个 file 对象并在整个块中保持打开状态,然后在最后关闭它。查看第一个示例in this article。如果您还有任何问题,请告诉我!
    • 谢谢,这已经很好用了。如何修改它以便在文件和控制台中都打印出来;不只评估一次打印语句,以便只执行一次耗时的函数?
    • @Julian 请检查另一个问题stackoverflow.com/a/24206109/9492673 中的“print_both”函数,以便打印到控制台和输出文件中
    【解决方案2】:

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

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

    【讨论】:

    • 有没有办法做到这一点并在控制台中显示文本?所以同时打印到控制台和文件?我希望能够看到我所有的进度打印语句,以便我知道程序在哪里执行,以及故障排除语句,但也可以将所有这些转储到文本文件中。
    • @Korzak 请检查另一个问题stackoverflow.com/a/24206109/9492673 中的“print_both”函数,以便打印到控制台和输出文件中
    • 这个是我最喜欢的。在使用 print 命令验证结果后,我只需注释掉/在一行中将结果保存在文件中。打印命令无需修改!
    • 要返回标准输出打印,您可以在sys.stdout = open('output.txt','wt') 之前添加temp = sys.stdout,在打印之后添加sys.stdout = temp
    • @Korzak 日志记录是此类设置的不错选择。 gies0r 的回答可以帮助到这里,this 解释也很清楚
    【解决方案3】:

    使用日志模块

    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()
    

    并开始记录/输出(ing):

    logger.debug('Hi! :)')
    

    【讨论】:

      【解决方案4】:

      可以直接将函数的返回输出附加到文件中。

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

      【讨论】:

      • 您的回答与已接受的答案有何不同?此外,您的代码甚至不起作用。错误的引号..
      【解决方案5】:

      另一个变体可以是......之后一定要关闭文件

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

      【讨论】:

        【解决方案6】:

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

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

        $ python ./myscript.py > output.txt
        

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

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

        【讨论】:

        • 这仅适用于 Linux。虽然我喜欢 linux,但有些人只是使用 Windoze——只要它不影响我,我完全可以接受。
        【解决方案7】:

        假设我的输入文件是“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/

        【讨论】:

          【解决方案8】:

          一定要导入 sys 模块。打印任何你想写和想保存的东西。在 sys 模块中,我们有 stdout,它接收并存储输出。然后关闭 sys.stdout 。这将保存输出。

          import sys
          print("Hello stackoverflow!" \
                "I have a question.")
          
          sys.stdout = open("/home/scilab/Desktop/test.txt", "a")
          sys.stdout.close()
          

          【讨论】:

            猜你喜欢
            • 2011-05-05
            • 1970-01-01
            • 2021-06-20
            • 1970-01-01
            • 2011-11-01
            • 1970-01-01
            • 2016-06-26
            • 1970-01-01
            相关资源
            最近更新 更多