2015-02-04 3 views
0

Ok У меня есть текстовый файл, представленный так:Использование Python для сортировки текстового файла

Data1A 
Data1B 

Data2A 
Data2B 

Там нет места между данными 1А и 1В и 2А и 2В, есть пространство, хотя, между 1 и 2.

можно ли использовать Python читать этот текстовый файл, а также организовать данные, как этот

Data1A Data1B 
Data2A Data2B 

предпочтительно я хотел бы, чтобы прочитать его, сортировки и экспортировать его в формате CSV, однако, даже просто сортируя его так разделы данных A и B являются рядом друг с другом.

Если это умело, не могли бы вы помочь мне найти достаточные учебники или что-то для достижения этого?

+1

Являются ли теги HTML частью вашего ввода? Подсказка: пожалуйста, введите код с четырьмя пробелами, –

+0

Насколько велика этот файл, примерно? Важно знать, потому что иногда легко читать весь файл в памяти и обрабатывать его. Но если это огромно, это невозможно, и вам нужно придумать что-то более умное. –

+1

В общем, я бы сделал это так: прочитайте файл в строке. Вызовите 'split (" \ n \ n ")', чтобы отделить раздел Data1 от раздела Data2. Итерации через каждый раздел, 'split (" \ n ")', чтобы получить набор строк, 'sort' them и' "" .join' строки создать резервную копию, так что они все одна строка по желанию. Затем вы готовы записать их обратно в файл. – Kevin

ответ

0

Предполагая, что это написано в файле in.txt:

with open("fin.txt","r") as fin: 
    a=[] 
    for line in fin: 
     a.append(line) 
b=sorted(a) 
aSorted=[[b[i+1][:-1] for i in range(len(b)-1)] ] 

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

with open("fou.csv","w") as fou: 
    for i in range(len(aSorted)//2): 
     fou.write("%s,\t%s\n" % (aSorted[0+i],aSorted[1+i])) 
+0

Теперь, когда Андрейс Кайников изменил его, я увидел, что есть одна пустая строка. Этого не было в исходной версии вопроса.Просто изменил мой код, чтобы принять это во внимание. – TomCho

0

Посмотрите itertools.groupby:

import itertools as it 

with open(fn_in, 'r') as fi, open(fn_out, 'w') as fo: 
    for b, lines in it.groupby(fi, key=str.strip): 
     if b: 
      fo.write(' '.join(line.strip() for line in lines) + '\n') 

Это работает даже для больших файлов, так как он работает последовательно строку за строкой.

Он группирует линии в соответствии с результатом str.strip (линия с линией перевода строки), которая составляет b = True для непустых линий и b = False для пустых строк. В lines вы получаете генератор линий, принадлежащих группе. Игнорируйте b = False, который обычно является пустой линией разделителя и присоединяется к lines для b = True.

0

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

import re 
reference_dict = {} 
with open("input", "r") as f: 
    for line in f.readlines(): 
     line = line.strip('\n') 
     regex = re.compile("^Data(?P<row>[0-9]*).*$") 
     search_result = regex.search(line) 
     if search_result: 
      row = search_result.groupdict()['row'] 
      if row in reference_dict: 
       reference_dict[row].append(line) 
      else: 
       reference_dict[row] = [line] 

print reference_dict #prints {'1': ['Data1A', 'Data1B'], '2': ['Data2A', 'Data2B']} 

У вас есть группировка по мере необходимости. Его можно использовать так, как вам нужно. Код является самоочевидным. Прокомментируйте, если вам нужно больше объяснений?