从文件中读取程序输出重定向到的文件

时间:2018-12-05 06:14:25

标签: python io-redirection

我有一个python程序。它输出一些行。 我像-

python process.py > output.txt

在执行process.py时,我想从process.py打开output.txt并使用保存的数据。

 with open("output.txt", 'r', encoding='utf-8') as template_file:
      template_file_content = template_file.readlines()
            for line in template_file_content:
                # use it

有什么办法做吗

4 个答案:

答案 0 :(得分:3)

否,输出重定向的结果在完成之前无法可靠地用于生产过程。特别是,许多操作系统将应用输出缓冲,这意味着只有在Python完成运行之后,才保证在外壳程序关闭打开的文件句柄时完全写入文件。

一种可能的解决方法可能是为process.py写一个包装器,然后将其输出捕获到变量中,然后再将其写入标准输出中。

如果您可以修改process.py,请将其更改为returnyield输出给调用者(如果它尚无执行此操作的代码路径),然后只需从代码中import开始使用它,而不是通过重定向将其作为单独的进程运行。

答案 1 :(得分:2)

您不应像以前那样调用程序-python process.py > output.txt将程序接受输出文件的方式更改为python process.py output.txt


使用> output.txt,您的程序将写入sys.stdout接下来与这些数据有关的不是您程序的业务,这是用户的业务。这是标准流的接口,使用它们时您需要注册。
即使您可能能够以某种方式破坏此限制,也可能会违反接口(从而使程序有问题)且不可靠(例如,输出可能不是到文件,而是到许多其他可能的目标,具体取决于操作系统)

相反,如果您接受输出文件作为参数,则在程序运行时,对其执行的操作没有任何限制-超出您自己在程序文档中所保证的范围。例如。如果这是一个“输出文件”,则您仅向用户保证程序完成后,该文件将具有其“输出”。
但是,从“输出文件”读取仍然不常见,您需要在程序的帮助下明确声明可以执行此操作-因为这意味着用户必须确保目标是无限的可读性强,不仅可读性强(例如,他们可能会通过named pipe传递给它)。

答案 2 :(得分:1)

执行此操作的一种方法(而不是使用output.txt中的数据)是保存在程序本身的列表中。这样,您就不必处理文件访问冲突。

另一种方法是将output.txt作为参数放入python程序,然后从程序内部对其进行写入。完成写入后,关闭文件,然后在读取文件时再次打开它。

答案 3 :(得分:-3)

在尝试访问其中的数据之前,您可能必须先保存(关闭)文件。您可能想尝试使用os.system()调用来“触摸”文件,即创建一个名为“ output.txt”的新文件,然后写入,然后再次读取。