[PYTHON] Trier les gros fichiers texte

Est-ce généralement comme ça?

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))

Correspond à la grande taille

J'ai écrit une fonction. Je fais quelque chose comme ↓.

  1. Lisez le fichier ligne par ligne
  2. Enregistrez les éléments suivants pour chaque ligne et rassemblez-les dans une liste
  1. Triez la liste des n ° 2
  2. Rouvrez le fichier fr
  3. Ouvrez le fichier de l'écrivain fw
  4. Accédez à la liste de # 3 et déplacez la position du fichier fr vers l'emplacement de la valeur de décalage du fichier.
  5. line = fr.readline ()
  6. `` fw.write (ligne) ''

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)

Essayez en fait

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

Trier les gros fichiers texte
Trier les gros fichiers texte en Python
Trier de gros fichiers avec python
Convertissez un grand nombre de fichiers PDF en fichiers texte à l'aide de pdfminer
Compressez tous les fichiers texte ci-dessous!
Rechercher des fichiers / répertoires volumineux sous Linux
Trier
Créer un gros fichier texte avec shellscript
Comment trouver des fichiers volumineux sous Linux