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

标签 python linux shell redirect

我有一个简单的 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/

相关文章:

linux - 如何测量 Linux 中 OpenMP 代码的内存使用情况?

linux - 从 Windows 执行远程 .sh 文件

linux - 为什么 shell 中的文件名后面要加上\n?

regex - 匹配文件内的字符串并返回结果

python - 使用scapy检测ARP中毒

Python PyGTK ListView 排序

python - 按照原句子中出现的顺序提取所有匹配的子字符串

python - 将数据框转换为字典

linux - 如何隐藏shell命令的特定标准输出

Linux循环移动文件到它们的子目录