У меня текстовый файл включает в себя более 10 миллионов строк. Линии как это:

37024469;196672001;255.0000000000
37024469;196665001;396.0000000000
37024469;196664001;396.0000000000
37024469;196399002;85.0000000000
37024469;160507001;264.0000000000
37024469;160506001;264.0000000000

Как вы видели, разделитель - это ";" Я хотел бы отсортировать этот текстовый файл с помощью Python в соответствии со вторым элементом. Я не мог использовать функцию разделения. Потому что это вызывает MemoryError. как я могу управлять этим?

6
user1907576 22 Янв 2013 в 22:05

2 ответа

Вы можете сделать это с помощью os.system() вызова функции bash sort

sort -k2 yourFile.txt 
1
thefourtheye 21 Фев 2015 в 15:22

Основано на Сортировке миллиона 32-разрядных целые числа в 2 МБ ОЗУ с использованием Python:

import sys
from functools import partial
from heapq import merge
from tempfile import TemporaryFile

# define sorting criteria
def second_column(line, default=float("inf")):
    try:
        return int(line.split(";", 2)[1]) # use int() for numeric sort
    except (IndexError, ValueError):
        return default # a key for non-integer or non-existent 2nd column

# sort lines in small batches, write intermediate results to temporary files
sorted_files = []
nbytes = 1 << 20 # load around nbytes bytes at a time
for lines in iter(partial(sys.stdin.readlines, nbytes), []):
    lines.sort(key=second_column) # sort current batch
    f = TemporaryFile("w+")
    f.writelines(lines)
    f.seek(0) # rewind
    sorted_files.append(f)

# merge & write the result
sys.stdout.writelines(merge(*sorted_files, key=second_column))

# clean up
for f in sorted_files:
    f.close() # temporary file is deleted when it closes

heapq.merge() имеет параметр key, начиная с Python 3.5 . Вместо этого вы можете попробовать mergeiter() из ответа Мартина Питерса или сделать преобразование Шварца в старых версиях Python:

iters = [((second_column(line), line) for line in file)
         for file in sorted_files] # note: this makes the sort unstable
sorted_lines = (line for _, line in merge(*iters))
sys.stdout.writelines(sorted_lines)

Применение:

$ python sort-k2-n.py < input.txt > output.txt
4
Community 23 Май 2017 в 10:29