Normalement, la méthode suivante est utilisée, mais elle consomme de la mémoire pour la taille du fichier.
with open('/path/to/not-sorted-file', 'r') as fr:
new_lines = sorted(fr.readlines()) #Développer en mémoire pour la taille du fichier
with open('/path/to/sorted-file', 'wb') as fw:
fw.write(''.join(new_lines))
J'ai écrit une fonction. Je fais quelque chose comme ↓.
fr
fw
fr
vers l'emplacement de la valeur de décalage du fichier.line = fr.readline ()
Cette méthode consomme de la mémoire pour "sous-chaîne x nombre de lignes" (; _;)
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.
'''
#Enregistrez le fichier avant de trier.
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)
Appelez la fonction comme suit.
> sort_large_file('/path/to/your/file', lambda l: l[:l.find(',')])
↓ Ceci est le CSV original.
2016-10-01,apple,red
2016-09-29,orange,orange
2015-12-21,banana,yellow
La fonction sort_large_file () nécessite également un saut de ligne sur la dernière ligne.
↓ Il sera trié comme ceci.
2015-12-21,banana,yellow
2016-09-29,orange,orange
2016-10-01,apple,red
Recommended Posts