我使用自定义的unix命令从Python中sorting文本文件,该命令将文件名作为input(或从stdin读取)并写入到stdout。 我想sortingmyfile
并保持sorting的版本。 从Python做这个临时文件是最好的方法吗? 我目前的解决scheme是:
inputfile = "myfile" # inputfile: filename to be sorted tmpfile = "%s.tmp_file" %(inputfile) cmd = "mysort %s > %s" %(inputfile, tmpfile) # rename sorted file to be originally sorted filename os.rename(tmpfile, inputfile)
这是最好的解决scheme吗? 谢谢。
如果您不想创建临时文件,则可以使用subprocess
:
import sys import subprocess fname = sys.argv[1] proc = subprocess.Popen(['sort', fname], stdout=subprocess.PIPE) stdout, _ = proc.communicate() with open(fname, 'w') as f: f.write(stdout)
您要么创建一个临时文件,要么将整个文件读入内存,并将其传送到您的命令。
最好的解决方案是使用os.replace,因为它也可以在Windows上工作。
但这并不是我所说的“就地排序”。 通常,就地排序意味着您实际上在列表中交换单个元素而不进行复制。 您正在制作副本,因为排序列表必须完全构建,才能覆盖原始文件。 如果你的文件变得非常大,这显然不会工作了。 你可能需要在原子性和就地性之间进行选择。
如果您的Python太旧,不能有os.replace,那么在添加os.replace的bug中有很多资源。
对于临时文件的其他用途,可以考虑使用tempfile模块 ,但我认为在这种情况下它不会获得太多收益。
你可以尝试一个截断写模式:
with open(filename, 'r') as f: model.read(f) model.process() with open(filename, 'w') as f: model.write(f)
注意这是非原子的
本条目描述了在Python中更新文件的一些优点/缺点: http : //blog.gocept.com/2013/07/15/reliable-file-updates-with-python/