为啥从我的python脚本写入文件被覆盖[重复]

Posted

技术标签:

【中文标题】为啥从我的python脚本写入文件被覆盖[重复]【英文标题】:Why is writing to a file from my python script getting overwritten [duplicate]为什么从我的python脚本写入文件被覆盖[重复] 【发布时间】:2017-03-29 23:27:24 【问题描述】:

这可能是一个简单的操作系统问题而不是编程问题,因此我们可能需要将其迁移到另一个社区。​​p>

我犯了一个错误,遇到了一些奇怪的行为,我想了解发生了什么。

在我的 python 脚本中,我调用了某人编写的 java 程序。他们使用 Logger 记录一些消息,我正在将 java 程序输出写入 outfile。我还想将我的脚本的输出重定向到另一个文件 b/c 我不想通过 java 程序的 msgs 进行搜索。

out = sys.argv[2]
...
...
with open(out, 'w') as outfile:
   # call some java programs via Popen but log 
   # some msgs after all the java programs have run
   cmd = ["java", "-cp", "blah.jar", "com.main.blah", "param1", "param2"]
   proc = subprocess.Popen(cmd, stdout=outfile)
   proc.wait()
....
....
print "got here to test where this msg gets written"

在运行我的脚本时,我无意中将 stdout 和 stderr 重定向到了相同的文件名。

python script.py input output > output 2>&1

由于这次事故,我遇到了这种奇怪的行为。似乎重定向的 stdout 和 stderr 被写入文件“输出”的开头而不是结尾,因此覆盖了 java 程序中的任何现有 msg

我只是好奇为什么会这样。我猜python脚本的文件指针一直在向前移动,因为java程序一直在写日志消息但是操作系统重定向的文件指针没有移动b/c它不知道脚本正在写任何东西,因此,当轮到重定向时,它会写入它认为是文件末尾的位置。它是否正确?希望有人能在这种情况下启发我。谢谢。

附:我“正确”地编写了命令,Java 程序输出确实转到了一个文件,而重定向确实转到了另一个文件

更新: 感谢所有的意见和 cmets/answers。我想我的问题措辞不正确,所以我可能会删除这个问题。我不认为这是一个重复的问题。这不是关于将 stdout 和 stderr 附加或写入同一个文件的问题。我知道该怎么做。这是一个关于有两件事试图写入同一个文件但输出都混淆的问题。我猜测发生了什么并将其放在我原来的帖子中,但似乎我写的内容不清楚。

【问题讨论】:

感谢所有的意见和 cmets/answers。我想我的问题措辞不正确,所以我可能会删除这个问题。我不认为这是一个重复的问题。这不是关于将 stdout 和 stderr 附加或写入同一个文件的问题。我知道该怎么做。这是一个关于有两件事试图写入同一个文件但输出都混淆的问题。我猜测发生了什么并将其放在我原来的帖子中,但似乎我写的内容不清楚 【参考方案1】:

在 bash 中:

> 将覆盖一个文件

>> 将附加到文件中

【讨论】:

您可以自己测试:echo "Hello, World!" > output1 echo "Hello, World!" > output1 cat output1 将只显示“Hello, World!” echo "Hello, World!" >> output1 echo "Hello, World!" >> output1 cat output1 将显示“你好,世界!你好,世界!” (两行)

以上是关于为啥从我的python脚本写入文件被覆盖[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使在关闭临时文件后我也能够写入和读取它?

Python file重复写入之前的内容不被后写入的覆盖

怎么做到Python file重复写入之前的内容不被后写入的覆盖

zipfile 将最后几行从我的文件中删除 - 为啥?

java 字节流 多个文件写入一个文件 为啥前面写入的内容会被覆盖了

Python处理并覆盖外部文本文件[重复]