2013-08-23 5 views
0

У меня есть текстовый файл, который нужно отсортировать по первому столбцу и объединить все повторы со счетчиком слева от данных, а затем записать отсортированные/подсчитанные данные в уже созданный файл csv.Сортировка текстового файла по первому столбцу и повторению счетчика python

Ex текстовый файл:

, 00.000.00.000, word, 00 
, 00.000.00.001, word, 00 
, 00.000.00.002, word, 00 
, 00.000.00.000, word, 00 
, 00.000.00.002, word, 00 
, 00.000.00.000, word, 00 

Ex результат:

, 3, 00.000.00.000, word, 00 
, 1, 00.000.00.001, word, 00 
, 2, 00.000.00.002, word, 00 

Мой код:

for ip in open("list.txt"): 
    with open(ip.strip()+".txt", "a") as ip_file: 
     for line in open("data.txt"): 
      new_line = line.split(" ") 
      if "blocked" in new_line: 
       if "src="+ip.strip() in new_line: 
        ip_file.write(", " + new_line[11]) 
        ip_file.write(", " + new_line[12]) 
        ip_file.write(", " + new_line[13]) 

for ip_file in os.listdir(sub_dir): 
     with open(os.path.join(sub_dir, ip_file), "a") as f: 
      data = f.readlines() 
      data.sort(key = lambda l: float(l.split()[0]), reverse = True) 

Всякий раз, когда я проверить код, я получаю ошибку TypeError: 'str' object is not callable или что-то подобное. Я не могу использовать .split() .read() .strip() и т.д., не получив ошибку.

Вопрос: Как я могу сортировать содержимое файлов и подсчитывать повторяющиеся строки (без определения функции)?

Я в основном пытаюсь:

sort -k1 | uniq -c | sed 's/^/,/' >> test.csv 
+1

Где происходит ошибка? Я не вижу смысла, когда код может попытаться вызвать 'str'. – Alfe

+1

Для подсчета повторений вы можете использовать 'collections.Counter' или' itertools.groupby() '. – Alfe

+0

@Alfe: Я не знаю, но это происходит в: 'data = file (f) .readlines()' – hjames

ответ

1
D = {} 
for k in open('data.txt'): #use dictionary to count and filter duplicate lines 
    if k in D: 
     D[k] += 1 #increase k by one if already seen. 
    else: 
     D[k] = 1 #initialize key with one if seen for first time. 

for sk in sorted(D): #sort keys 
    print(',', D[sk], sk.rstrip(), file=open('test.csv', 'a')) #print a comma, followed by number of lines plus line. 

#Output 
, 3, 00.000.00.000, word, 00 
, 1, 00.000.00.001, word, 00 
, 2, 00.000.00.002, word, 00  
+0

Спасибо! Это сработало отлично. Как бы преобразовать 'print' в' csv_file.write', поскольку запись только разрешает один аргумент? – hjames

+1

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

+0

Это сработало так прекрасно. Я слишком долго работаю над этой проблемой. Большое спасибо! – hjames

1

Как об этом:

input = ''', 00.000.00.000, word, 00 
, 00.000.00.001, word, 00 
, 00.000.00.002, word, 00 
, 00.000.00.000, word, 00 
, 00.000.00.002, word, 00 
, 00.000.00.000, word, 00'''.split('\n') 

input.sort(key=lambda line: line.split(',')[1]) 

for key, values in itertools.groupby(input, lambda line: line.split(',')[1]): 
    values = list(values) 
    print ', %d%s' % (len(values), values[0]) 

В этом отсутствуют все проверки ошибок (например, непригодных линий и т.д.), но, возможно, вы можете добавить, что сами по к вашим потребностям. Кроме того, split выполняется дважды; один раз для сортировки и один раз для группировки. Вероятно, это можно улучшить.

0

Я хотел бы рассмотреть возможность использования модуля Панды обработки данных

import pandas as pd 
my_data = pd.read_csv("C:\Where My Data Lives\Data.txt", header=None) 
sorted_data = my_data.sort_index(by=[1], ascending=1) # sort my data 
sorted_data = sorted_data.drop_duplicates([1])   # leaves only unique values, sorted in order 
counted_data = list(my_data.groupby(1).size())   #counts the unique values in data, coverts to a list 
sorted_data[0] = counted_data       # inserts the list into your data frame 
+0

Единственная проблема с использованием pandas заключается в том, что требуется установка пакета, и все должно быть сделано из сценария py, без работы, требуемой от пользователя – hjames

+0

@hjames. Я не уверен, что следую вашему заявлению. Вы ищете базовое решение Python (без дополнительных модулей)? Этот скрипт не потребует от пользователя ничего делать, кроме типа и запускает код :) –

+0

Хм, я просто предположил, что мне нужно будет установить пакет pandas, чтобы импортировать модуль? – hjames

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