为啥从我的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重复写入之前的内容不被后写入的覆盖