【问题标题】:Python script need to save output to text filePython脚本需要将输出保存到文本文件
【发布时间】:2018-12-21 12:13:37
【问题描述】:

我从互联网上拼凑了一些代码来捕获按下的键和当前活动的窗口标题,并试图将 python 脚本的输出写入文本文件。

该脚本在 IDLE 控制台中运行良好,并打印按下的键并记录当前活动窗口中的任何更改。

from pynput.keyboard import Key, Listener
import time
from win32gui import GetWindowText, GetForegroundWindow
import datetime
from threading import Thread

def on_press(key):
    print ('{0} pressed'.format(key))   

def on_release(key):
    ('{0} release'.format(key))
    if key == Key.esc:
        return False

def get_titles():
    current_title = None
    while True:
        moment2 = datetime.datetime.now().strftime("%d-%b-%Y [ %H:%M:%S ]")
        new_title = GetWindowText(GetForegroundWindow())
        if new_title != current_title:
            if len(new_title) > 0:
                #logging.info(" Moved to : " + new_title)
                current_title = new_title
                time.sleep(0.1)
                #print(new_title)
                ff= (moment2 + " : " +  "Moved T0 : "+ new_title)
                print (ff)

我正在寻找一种简单的方法来将我在控制台中看到的输出写入文本文件。这可能很简单,但我是一个初学者。谢谢

【问题讨论】:

标签: python text save output


【解决方案1】:

Python 有一个原生的open() 函数,不需要导入,它允许你处理文件。此函数将文件“加载”到内存中,并且可以设置为各种模式:

  • open("filename.txt", "a"),将内容追加到新行;
  • open("filename.txt", "w"),覆盖内容;和
  • open("filename.txt", "r"),将其设置为只读。
  • open("filename.txt", "x"),创建文件。


如果您希望在文件不存在的情况下创建文件,则可以在每种模式中添加“+”(“a+”、“w+”)。
您将内存中的文件定义为如下变量:a = open("filename.txt", "w"),然后可以text = a.read() 将文件的内容加载到字符串中,或​​者a.readlines() 将字符串加载到数组中,按\n 拆分.
使用a.write("Your desired output") 将内容保存到文件中,如果文件处于写入或追加方式。

编辑:

尽量只在实际需要时才打开文件。

with open("filename.txt", "r") as f:
    file_contents = f.read()
    # file_contents = "This file contains\nvery important information"

    file_lines = f.readlines()
    # file_lines = ["This file contains", "very important information"]
    # Similar to file_lines = file_contents.split("\n")

为了避免阻塞您程序的其他部分,并避免在 Python 意外崩溃时损坏您的文件。

【讨论】:

  • 感谢mazunki,我可以获得一些简单的文本字符串来写入文件,但我无法让它写入我想要的输出。 ff= (moment2 + " : " + "Moved T0 : "+ new_title) 和 def on_press(key): print ('{0} pressed'.format(key))
  • 尝试type(ff)检查ff是否为字符串。如果不是,请在将其附加到文件之前将其转换为 ff=str(ff) 之一。或者,创建另一个名为 save_to_file() 的函数来处理有关文件的所有内容。
【解决方案2】:

只需添加

with open('textfile.txt', 'a+') as f:
  f.write(ff)

a 选项用于附加到文件,+ 表示如果文件不存在,只需创建一个具有指定名称的文件。

编辑:

def on_press(key):
    print ('{0} pressed'.format(key))
    with open('textfile.txt', 'a+') as f:
      f.write(ff) 

编辑 2:

def on_press(key):
    print ('{0} pressed'.format(key))
    k = key + '\n'
    with open('textfile.txt', 'a+') as f:
      f.write(key) 

# and in get_titles()
ff= (moment2 + " : " +  "Moved T0 : "+ new_title + '\n')
with open('textfile.txt', 'a+') as f:
      f.write(ff)

【讨论】:

  • 感谢您的帮助。当我添加你提到的代码时,我得到一个错误“NameError: name 'ff' is not defined”,虽然我可以看到 ff= (moment2 + " : " + "Moved T0 : "+ new_title)
  • 你必须在循环中而不是print(ff)
  • 啊,好吧,这有点奏效。现在它正在将活动窗口写入文本文件,而不是键输入。
  • 嗯,你必须以某种方式将按下的键值添加到一个变量中,然后你可以将它附加到ff 字符串并以相同的方式保存它。或者在f.write(ff) 下写f.write(pressedKey),其中pressedKey 是您保存按下的键的变量。
  • 或者您可以设置函数on_press(key) 将输出保存到同一个文件,就像我在答案中写的一样。所以现在,on_press(key) 函数看起来就像答案中的那个(我编辑了它,所以看看)
【解决方案3】:

在控制台运行程序时试试这个

python your_script.py > path_to_output_file/outpot.txt

如果 '>' 不起作用,请尝试 '>>'

【讨论】:

  • 这对 print() 也有效吗?据我所知,这只会更改默认输出流。不影响错误流或其他功能。
  • 检查不同的输出模式:askubuntu.com/questions/420981/…
  • 谢谢大家,我宁愿把它从脚本中保存到一个文件中,而不是在启动它时运行一个命令。
  • 作为注释,> 实际上会覆盖文件,而>> 实际上会附加到文件末尾的文本。它们都适用于标准输出,而不适用于错误输出。