在unix系统上用pythonsorting文件

我使用自定义的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/