[PYTHON] Sortieren Sie große Textdateien

Ist es normalerweise so?

Normalerweise wird die folgende Methode verwendet, sie verbraucht jedoch Speicher für die Dateigröße.

with open('/path/to/not-sorted-file', 'r') as fr:
    new_lines = sorted(fr.readlines()) #Erweitern Sie den Speicher für die Dateigröße

with open('/path/to/sorted-file', 'wb') as fw:
    fw.write(''.join(new_lines))

Entspricht einer großen Größe

Ich habe eine Funktion geschrieben. Ich mache so etwas wie ↓.

  1. Lesen Sie die Datei Zeile für Zeile
  2. Speichern Sie Folgendes für jede Zeile und fügen Sie sie in einer Liste zusammen
  1. Sortieren Sie die Liste von # 2
  2. Öffnen Sie die Datei fr erneut
  3. Öffnen Sie die Datei fw des Autors
  4. Foreach die Liste von # 3 und verschieben Sie die Position der Datei fr an die Position des Datei-Offset-Werts.
  5. line = fr.readline ()
  6. fw.write (line)

Diese Methode belegt Speicher für "Teilzeichenfolge x Anzahl der Zeilen" (; _;)

import os
import uuid
import tempfile

def sort_large_file(filename, key=lambda l: l[:5]):
    '''
    sort large file without on-memory.

    :param str filename: abspath of file.
    :param function key: the function makes sort-key from a line.
    '''
    #Speichern Sie die Datei vor dem Sortieren.
    tmpname = os.path.join(tempfile.gettempdir(), 'sortlargefile_%s' % (uuid.uuid4().get_hex()))
    os.rename(filename, tmpname)

    # make a list of offsets.
    offset_list = []
    with open(tmpname, 'r') as fr:
        while True:
            offset = fr.tell()
            line = fr.readline()
            if not line:
                break

            keyword = key(line)
            offset_list.append((keyword, offset, ))

    # sort offsets.
    offset_list.sort(key=lambda e: e[0])

    # sort (write to new file).
    with open(filename, 'wb') as fw, open(tmpname, 'r') as fr:
        for keyword, offset in offset_list:
            fr.seek(offset)
            line = fr.readline()
            fw.write(line)

    # remove tmp.
    os.remove(tmpname)

Eigentlich versuchen

Rufen Sie die Funktion wie folgt auf.

> sort_large_file('/path/to/your/file', lambda l: l[:l.find(',')])

↓ Dies ist die ursprüngliche CSV.

2016-10-01,apple,red
2016-09-29,orange,orange
2015-12-21,banana,yellow

Die Funktion sort_large_file () erfordert auch einen Zeilenumbruch in der letzten Zeile.

↓ Es wird so sortiert.

2015-12-21,banana,yellow
2016-09-29,orange,orange
2016-10-01,apple,red

Recommended Posts

Sortieren Sie große Textdateien
Sortieren Sie große Textdateien in Python
Sortieren Sie große Dateien mit Python
Konvertieren Sie eine große Anzahl von PDF-Dateien mit pdfminer in Textdateien
Komprimieren Sie alle Textdateien unten!
Finden Sie große Dateien / Verzeichnisse unter Linux
Sortieren
Erstellen Sie eine große Textdatei mit Shellscript
So finden Sie große Dateien unter Linux