调用subprocess.check_call()
允许为stdout指定文件对象,但在将数据写入文件之前,我想在逐行基础上修改它们。
我目前将输出重定向到临时文件(由tempfile.TemporaryFile()
创建。check_call
完成后,我逐行读取该临时文件,进行修改并编写最终输出文件。
由于输出很大,纯粹的内存解决方案是不可行的,我想在运行中修改数据并直接写入最终输出文件。
有谁知道如何实现这一目标?
答案 0 :(得分:2)
def check_call_modify(command, modifier_function, output_file)
p = subprocess.Popen(command, stdout=subprocess.PIPE)
for line in p.stdout:
line = modifier_function(line)
output_file.write(line)
p.wait()
if p.returncode:
raise subprocess.CalledProcessError(p.returncode, command)
return p.returncode
使用它传递一个函数来修改每一行和文件。下面的愚蠢示例会将ls -l
的结果以大写字母保存到listupper.txt
:
with open('listupper.txt', 'w') as f:
check_call_modify(['ls', '-l'], operator.methodcaller('upper'), f)
答案 1 :(得分:-1)
Python是鸭子类型,因此您可以在将文件对象传递给check_call
之前始终将其包装起来。
这个答案有一个doing it for write()
的例子,但为了彻底,你可能还想包裹writelines()
。