Sortierung der Datei mit Python auf Unix-System

Ich sortiere eine Textdatei von Python mit einem benutzerdefinierten Unix-Befehl, der einen Dateinamen als Eingabe nimmt (oder liest von stdin) und schreibt an stdout. Ich möchte myfile sortieren und die sortierte Version an ihrem Platz halten. Ist der beste Weg, dies aus Python zu machen, um eine temporäre Datei zu machen? Meine aktuelle Lösung ist:

 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) 

Ist das die beste Lösung? Vielen Dank.

4 Solutions collect form web for “Sortierung der Datei mit Python auf Unix-System”

Wenn Sie keine temporären Dateien erstellen möchten, können Sie den subprocess wie in:

 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) 

Sie erstellen entweder eine temporäre Datei, oder Sie müssen die ganze Datei in den Speicher lesen und an Ihren Befehl weiterleiten.

Die beste Lösung ist, os.replace zu benutzen, weil es auch unter Windows funktionieren würde.

Das ist nicht wirklich das, was ich als "in-place sorting" annehme. In der Regel, In-Place-Sortierung bedeutet, dass Sie tatsächlich austauschen einzelne Elemente in den Listen ohne Kopien. Sie machen eine Kopie, da die sortierte Liste vollständig gebaut werden muss, bevor Sie das Original überschreiben können. Wenn deine Dateien sehr groß werden, wird das natürlich nicht mehr funktionieren. Sie müssten vermutlich zwischen Atomität und In-Place-Iity wählen.

Wenn dein Python zu alt ist, um zu sehen, gibt es viele Ressourcen in dem Bug, der os.replace hinzufügt .

Für andere Verwendungen von temporären Dateien, können Sie in Erwägung ziehen, das Tempfile-Modul zu verwenden , aber ich glaube nicht, dass es Ihnen viel in diesem Fall gewinnen würde.

Du könntest ein Truncate-Write-Muster ausprobieren:

 with open(filename, 'r') as f: model.read(f) model.process() with open(filename, 'w') as f: model.write(f) 

Beachten Sie, dass dies nicht atomar ist

Dieser Eintrag beschreibt einige Vor- und Nachteile der Aktualisierung von Dateien in Python: http://blog.gocept.com/2013/07/15/reliable-file-updates-with-python/

  • Rückgabewert von Shell-Befehl in Python erhalten
  • Effizientes Aufteilen einer Datei in mehrere Dateien nach Wert der Spalte
  • Lipo: kann nicht herausfinden, die Architektur Typ von: / var / Ordner /
  • Svnperms pre-commit Haken einrichten
  • Wie kann ich Signalhandler zu einer in Py3k / Python geschriebenen Shell hinzufügen?
  • Versuche, eine solide Python-Installation zu installieren, die auf meinem Mac arbeitet?
  • Wie sende und empfange ich Echtzeit-Signale `sigqueue ()` in Python?
  • Kann nicht ascii Zeichen lesen 26?
  • Subprocess stdout / stderr zur endlichen Größe logfile
  • Aufteilung der Datei in kleinere Dateien nach Anzahl der Felder
  • Wie entpackst du einen JAR in einem UNIX-Dateisystem mit einem einzigen Befehl und speziere sein Zielverzeichnis mit dem JAR-Befehl?
  • Python ist die beste Programmiersprache der Welt.