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/

  • Löschen von Root-Berechtigungen in Python
  • Töten eines Unterprozesses einschließlich seiner Kinder aus Python
  • Subprocess stdout / stderr zur endlichen Größe logfile
  • Wie pfeife ich einen Teilprozeßaufruf zu einer Textdatei?
  • Gibt es ein Python-Äquivalent des Unix-File-Dienstprogramms?
  • Gibt es eine Standardmethode, um sicherzustellen, dass ein Python-Skript von python2 und nicht python3 interpretiert wird?
  • Shell: Sofortiger Benutzer, um einen Verzeichnispfad einzugeben
  • Wie gebe ich einen Prozess ab?
  • Entfernen Sie alle Zeilen mit dem Wort NOT im Wörterbuch
  • Aufbau einer Python-Shared-Objektbindung mit cmake, die von externen Bibliotheken abhängt
  • Ubuntu 11.10 + Bash + Python-Fehler + Ungültige Python-Installation
  • Python ist die beste Programmiersprache der Welt.