1

我正在使用自定义 unix 命令对 Python 中的文本文件进行排序,该命令将文件名作为输入(或从标准输入读取)并写入标准输出。我想对myfile排序后的版本进行排序并将其保留在原位。是从 Python 中创建临时文件的最佳方法吗?我目前的解决方案是:

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)

这是最好的解决方案吗?谢谢。

4

4 回答 4

3

如果您不想创建临时文件,可以使用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)
于 2013-01-19T00:47:40.910 回答
1

最好的解决方案是使用os.replace,因为它也可以在 Windows 上运行。

不过,这并不是我所认为的“就地排序”。通常,就地排序意味着您实际上交换列表中的单个元素而不进行复制。您正在制作副本,因为必须先完全构建排序列表,然后才能覆盖原始列表。如果您的文件变得非常大,这显然不再适用。那时您可能需要在原子性和就地性之间进行选择。

如果您的 Python 太旧而无法安装 os.replace,那么在添加 os.replace 的 bug中有很多资源。

对于临时文件的其他用途,您可以考虑使用tempfile 模块,但我认为在这种情况下它不会给您带来太多好处。

于 2013-01-19T00:42:19.410 回答
1

您要么创建一个临时文件,要么必须将整个文件读入内存并将其通过管道传递给您的命令。

于 2013-01-19T00:35:57.857 回答
0

您可以尝试截断写入模式:

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/

于 2014-06-19T02:17:16.893 回答