2015-11-06 2 views
1

У меня есть программа, которая печатает списки в файл, но я хочу, чтобы они были отсортированы на основе первого слова, так что совпадающие элементы находятся рядом друг с другом.Python - Сортировка строк в файле на основе первого слова?

Например, файл может включать в себя:

Pizza 5 
Taco 6 
Pizza 4 
Taco 8 

Я хочу код, чтобы прочитать файл и сортировать содержимое, так что заказ на основе первых слов, соответствующих, писать что-то вроде этого в файл:

Pizza 5 
Pizza 4 
Taco 8 
Taco 6 

Любая помощь?

ответ

5

Вы можете просто прочитать строки, отсортировать их в алфавитном порядке и записать их обратно в тот же файл:

with open("myfile", "r+") as f: 
    lines = f.readlines() 
    lines.sort()   
    f.seek(0) 
    f.writelines(lines) 

Это предполагает, что файл помещается в оперативной памяти. Если это не так, вам нужно реализовать какой-то тип слияния.

+1

Незначительное улучшение: измените последнюю строку на 'f.writelines (lines)', что позволяет избежать необходимости построить огромную строку; 'writelines' будет перебирать' lines' и записывать их один за другим напрямую (так как файл буферизирован, мелкие записи на самом деле не имеют значения). – ShadowRanger

+0

@ ShadowRanger: Хороший улов, обновленный. –

-2

Вы можете создать list, затем петлю через sorted список, чтобы получить желаемый результат:

L = [] 
with open("yourfile.txt", "r") as f: 
    for line in f: 
     L.append(line) 
for i in sorted(L): 
    print i.strip() 

Выход:

Pizza 4 
Pizza 5 
Taco 6 
Taco 8 
+1

Построение списка с помощью собственного цикла - это просто трата времени. Вы можете напрямую: 'L = sorted (f)' и пропустить создание пустого списка, цикл 'append', чтобы сделать unsorted 'list', и просто« отсортировать »slurp и отсортировать все сразу. – ShadowRanger

+1

@ShadowRanger Работает ли мой ответ? ДА! Доставляет ли он желаемый результат? ДА! Есть ли лучший, более эффективный способ ответить на этот вопрос? ДА! Должен ли мой ответ отклоняться? НЕТ! –

0

Просто используйте readlines(), который считывает строки файла в список и примените к нему sorted().

+0

'readlines' является избыточным/бессмысленным; файловые объекты являются итераторами их строк, и 'sorted' уже будет обрабатывать предоставленный итератор для вас. – ShadowRanger

+0

Это не совсем избыточно. Если вы хотите работать с текстом впоследствии, вы не хотите, чтобы в ваших линиях были разрывы строк и т. Д. Вот почему в некоторых случаях имеет смысл использовать 'readlines()' –

+0

'readlines()' оставляет разрывы строк. – ShadowRanger

Смежные вопросы