Подтвердить что ты не робот

Файл сортировки на месте с Python в системе unix

Я сортирую текстовый файл с Python, используя пользовательскую команду unix, которая принимает имя файла как вход (или читает из stdin) и записывает в stdout. Я хотел бы отсортировать 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)

Это лучшее решение? спасибо.

4b9b3361

Ответ 1

Если вы не хотите создавать временные файлы, вы можете использовать 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)

Ответ 2

Вы либо создаете временный файл, либо вам нужно будет прочитать весь файл в памяти и передать его в свою команду.

Ответ 3

Лучшее решение - использовать os.replace, потому что он будет работать и на Windows.

На самом деле это не то, что я считаю "сортировкой на месте". Обычно сортировка на месте означает, что вы фактически обмениваетесь отдельными элементами в списках, не делая копии. Вы делаете копию, так как отсортированный список должен быть полностью построен, прежде чем вы сможете перезаписать оригинал. Если ваши файлы становятся очень большими, это, очевидно, больше не будет работать. Вероятно, вам нужно будет выбрать между атомарностью и местом на месте.

Если ваш Python слишком стар, чтобы иметь os.replace, есть много ресурсов в ошибка добавления os.replace.

Для других видов использования временных файлов вы можете использовать модуль tempfile, но я не думаю, что это принесло бы вам много усилий в этом случай.

Ответ 4

Вы можете попробовать шаблон усечения-записи:

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/