2016-07-13 18 views
0

Ich habe folgende Log-Dateien und ich möchte es spalten und sie in einer geordneten Datenstruktur setzen (so etwas wie eine Liste der Liste) mit Python 3.4Parsing-Protokolldatei mit Python

Die Datei folgt diese Struktur:

Month #1 
1465465464555 
345646546454 
442343423433 
724342342655 
34324233454 
24543534533 
***Day # 1 
5465465465465455 
644654654654454 
4435423534833 
***Day #2 
24876867655 
74654654454 
643876867433 
***Day #3 
445543534655 
344876867854 
64365465433 
Month #2 
7454353455 
84756756454 
64563453433 
***Day # 1 
44756756655 
34453453454 
243867867433 
***Day #2 
64465465455 
74454353454 
34878733 
***Day #3 
1449898955 
643434354 
843090909888433 

Ziel ist es, in der Lage zu sein, die Anzahl der Monate zu fahren und jeden Tag getrennt arbeiten zu können. ich sollte in der Lage sein, so etwas zu tun:

for month in months: 
for day in days: 
    for number in day: 
    print(number) 

Die Lösung, die ich angenommen habe Monate aus der Datei ist folgendes zu extrahieren, aber es ist nicht eine intelligente Lösung. Ich brauche etwas besser

lista = [] 

in_file = open("log.txt","r") 
righe= in_file.readlines() 
in_file.close() 


for i in range(0,len(righe)): 
    if "Month" in righe[i]: 
     lista.append(i) 


lista.append((len(righe)-1)) 
counter = 1 
for i in range(0,len(lista)-1): 
    out_file = open(str(counter)+".txt","w") 
    for j in range(lista[i], lista[i+1]): 
     out_file.write(righe[j]) 
    out_file.close() 
    counter=counter+1 



for i in range(1,counter): 
    print("Month: ", i) 
    mano = open(str(i)+".txt","r") 
    righe= mano.readlines() 
    print(righe) 
    mano.close() 

Antwort

0

Nun, hier haben wir einige Antworten auf diese Frage.

Hier ist mein Beitrag, ich löste das Problem mit einer rekursiven Lösung. Also, für eine neue Art zu denken:

def loop(stopParam, startArr, resultArr=[]): 
    if startArr == []: 
     return (resultArr, startArr) 
    elif stopParam in startArr[0]: 
     return (resultArr, startArr) 
    else: 
     return loop(stopParam, startArr[1:], resultArr + [startArr[0]]) 

def buildList(arr, testVal={}): 
    if 'Month' in (arr[0] if arr != [] else ''): 
     res = loop('Month', arr[1:]) 
     testVal[arr[0]] = res[0] 
     return buildList(res[1], testVal) 
    else: 
     return testVal 


in_file = open("test.txt","r") 
righe= in_file.readlines() 
in_file.close() 

print buildList(righe) 

Dies ist eine Lösung.

0

itertools.groupby aus den Standard-lib für diese Art von Arbeit eine leistungsstarke Funktion ist. Der folgende Code findet Gruppen von Zeilen nach Monat und dann innerhalb des Monats für den Aufbau einer verschachtelten Datenstruktur. Sobald Sie fertig sind, können Sie diese Struktur nach Monat und Monat für Tag durchlaufen.

data = """\ 
Month #1 
1465465464555 
345646546454 
442343423433 
724342342655 
34324233454 
24543534533 
***Day # 1 
5465465465465455 
644654654654454 
4435423534833 
***Day #2 
24876867655 
74654654454 
643876867433 
***Day #3 
445543534655 
344876867854 
64365465433 
Month #2 
7454353455 
84756756454 
64563453433 
***Day # 1 
44756756655 
34453453454 
243867867433 
***Day #2 
64465465455 
74454353454 
34878733 
***Day #3 
1449898955 
643434354 
843090909888433""".splitlines() 
# or data = open(data_file).read().splitlines() 

from itertools import groupby 

# some simple boolean functions to detect Month and Day marker lines 
is_month_line = lambda s: s.startswith("Month") 
is_day_line = lambda s: s.startswith("***Day") 

grouped_data = [] 
for is_month, month_lines in groupby(data, key=is_month_line): 
    if is_month: 
     # detected a 'Month' marker - save it and create placeholder in grouping structure 
     current_month = list(month_lines)[0] 
     current_month_data = [] 
     grouped_data.append([current_month, current_month_data]) 

     # set up blank day for month-level data lines 
     current_day = '' 
     current_day_data = [] 
     current_month_data.append([current_day, current_day_data]) 
    else: 
     # found group of non-'Month' lines, group by days 
     for is_day, day_lines in groupby(month_lines, key=is_day_line): 
      if is_day: 
       # day marker detected, save it for storing day values 
       current_day = list(day_lines)[0][3:] 
       current_day_data = [] 
       current_month_data.append([current_day, current_day_data]) 
      else: 
       # all non-day lines, add to current day's data 
       current_day_data.extend(day_lines) 

Verwenden pprint, um die verschachtelten Listen auskippen:

from pprint import pprint 
pprint(grouped_data, width=120) 

gibt:

[['Month #1', 
    [['', ['1465465464555', '345646546454', '442343423433', '724342342655', '34324233454', '24543534533']], 
    ['Day # 1', ['5465465465465455', '644654654654454', '4435423534833']], 
    ['Day #2', ['24876867655', '74654654454', '643876867433']], 
    ['Day #3', ['445543534655', '344876867854', '64365465433']]]], 
['Month #2', 
    [['', ['7454353455', '84756756454', '64563453433']], 
    ['Day # 1', ['44756756655', '34453453454', '243867867433']], 
    ['Day #2', ['64465465455', '74454353454', '34878733']], 
    ['Day #3', ['1449898955', '643434354', '843090909888433']]]]] 
+0

Eine andere Option könnte sein, einen [ConfigParser] (https://docs.python.org/3.5/library/configparser.html) zu verwenden und Ihre Protokolldatei neu zu formatieren (falls das eine verfügbare Route ist). – pat

+0

Thx für die Antwort auf Paul. Es ist fast genau das, wonach ich gesucht habe. Das Problem ist, dass die verschachtelte Struktur erstellt mich ein wenig von Verwirrung macht. Wie erreiche ich zum Beispiel iterativ alle Tage eines Monats (unter Berücksichtigung , dass ein Tag möglicherweise nicht in einem Monat sein wird)? –

3

Wenn Sie den verschachtelten dict Weg gehen wollen:

month, day = 0, 0 
log = {} 
with open("log.txt") as f: 
    for line in f: 
     if 'Month' in line: 
      month += 1 
      day = 0 
      log[month] = {0:[]} 
     elif 'Day' in line: 
      day += 1 
      log[month][day] = [] 
     else: 
      log[month][day].append(line.strip()) 

Beachten Sie, dass ich das entrie angenommen habe s unmittelbar nach einem Monat Linie sind Tag 0. Die Struktur sieht nun wie:

>>> from pprint import pprint 
>>> pprint(log) 
{1: {0: ['1465465464555', 
     '345646546454', 
     '442343423433', 
     '724342342655', 
     '34324233454', 
     '24543534533'], 
    1: ['5465465465465455', '644654654654454', '4435423534833'], 
    2: ['24876867655', '74654654454', '643876867433'], 
    3: ['445543534655', '344876867854', '64365465433']}, 
2: {0: ['7454353455', '84756756454', '64563453433'], 
    1: ['44756756655', '34453453454', '243867867433'], 
    2: ['64465465455', '74454353454', '34878733'], 
    3: ['1449898955', '643434354', '843090909888433']}} 

Und Sie können mit darüber iterieren:

for month_index in sorted(log): 
    month = log[month_index] 
    for day_index in sorted(month): 
     day = month[day_index] 
     for number in day: 
      print(number) 
+0

Danke Danyule –