gpt4 book ai didi

python - 使用 Linux 重定向从 Python 脚本覆盖文件

转载 作者:太空狗 更新时间:2023-10-29 11:26:39 26 4
gpt4 key购买 nike

我有一个简单的 python 脚本,它只接受一个文件名,并吐出该文件的修改版本。我想重定向 stdout(使用命令行中的“>”),以便我可以使用我的脚本用我的修改覆盖文件,例如python myScript.py 测试.txt > 测试.txt

当我这样做时,生成的 test.txt 不包含原始 test.txt 中的任何文本 - 仅包含 myScript.py 添加的内容。但是,如果我不重定向 stdout,则修改会正确输出。

更具体地说,这是一个例子:


我的脚本.py:

#!/usr/bin/python
import sys

fileName = sys.argv[1]
sys.stderr.write('opening ' + fileName + '\n')

fileHandle = file(fileName)
currFile = fileHandle.read()
fileHandle.close()

sys.stdout.write('MODIFYING\n\n' + currFile + '\n\nMODIFIED!\n')

测试.txt

Hello World

python myScript.py test.txt > test.txt 的结果:

MODIFYING



MODIFIED!

最佳答案

它以这种方式工作的原因是,在 Python 启动之前,Bash 会解释重定向运算符并打开输出流以将标准输出写入文件。该操作将文件截断为 0 大小——换句话说,它清除了文件的内容。因此,当您的 Python 脚本启动时,它会看到一个空的输入文件。

最简单的解决方案是将 stdout 重定向到不同的文件,然后将其重命名为原始文件名。

python myScript.py test.txt > test.out && mv test.out test.txt

或者,您可以更改您的 Python 脚本以将修改后的数据写回到文件本身,这样您就根本不必重定向标准输出。

关于python - 使用 Linux 重定向从 Python 脚本覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com