2013-07-24 3 views
2

У меня есть файл с каждой строкой, какобработка файлов в памяти

name1 Имя2 name3

Я могу читать его в одну строке, разделить каждую линию, процесс линии и вывод обрабатывается построчно.

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

Моей первой попытка разбивает каждую строку, как это читайте, чтобы составить список кортежей, затем сортирует с помощью key =, затем присоединяется к каждому кортежу и выводит строку за строкой.

Есть ли более питонический способ сделать это?

+0

Вы хотите сказать, что это сортировка по средней колонке? – mgilson

+0

Да, это правильно. – phoenix

+0

Вы можете сделать это очень эффективно с помощью нескольких труб nix. –

ответ

4

Нечто подобное должно сделать:

with open('datafile') as fin: 
    lines = list(fin) 
    lines.sort(key=lambda line: line.split()[1]) 

with open('outfile','w') as fout: 
    fout.writelines(lines) 

Несколько замечаний:

  • Мой ключ сортировки немного некрасиво. Однако преимуществом здесь является то, что он сохраняет строки точно так же, как и во входном файле. Если мы разделим строки и затем отсортированы, код может быть немного красивее, но нам нужно будет правильно подключить разделенные строки на выходе (плюс пробелы могут быть потеряны)

  • outfile может быть одним и тем же именем файла в качестве файла данных, чтобы сделать изменение эффективно «на месте»

  • Если вам необходимо поддерживать цитирование полей (field1 "field 2" field3), то вы захотите посмотреть модуль csv.

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