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