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))
Ich habe eine Funktion geschrieben. Ich mache so etwas wie ↓.
fr
erneut fw
des Autors fr
an die Position des Datei-Offset-Werts.line = fr.readline ()
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)
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