使用Linux重定向从Python脚本重写文件

2024-09-28 03:14:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的python脚本,它只接受一个文件名,并输出该文件的修改版本。我想重定向stdout(从命令行使用'>;',这样我就可以使用我的脚本用我的修改覆盖一个文件,例如python myScript.py test.txt > test.txt

当我这样做,结果测试.txt不包含原始文本测试.txt-只是由myScript.py. 但是,如果我不重定向stdout,那么修改就会正确地出来。在

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


在myScript.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在

^{pr2}$

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

MODIFYING



MODIFIED!

Tags: 文件pytesttxt脚本文件名stdoutsys
3条回答

Debian中的moreutils包中的实用程序sponge可以优雅地处理这一问题。在

python myScript.py test.txt | sponge test.txt

正如其名称所示,sponge将在打开之前完全耗尽其标准输入测试.txt并写出stdin的全部内容。在

你可以得到最新版本的海绵here。moreutils主页是here。在

尝试将其重定向到新文件,重定向运算符可能会在附加文件之前删除该文件。在

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

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

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

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

相关问题 更多 >

    热门问题