2016-05-25 7 views
1

Ich bin ziemlich neu für Pandas. Ich habe eine Protokolldatei. Ich versuche, wenige Datenpunkte aus der Datei zu holen. Unten ist der Code, der mir die gewünschten Daten bringt, aber nicht im gewünschten Format. Ich wollte Pandas Datenrahmen mit zwei Spalten.Konvertieren von Textdatei mit Ausrichtung in Pandas DataFrame

import os 
from collections import Counter 
import pandas as pd 
#print(os.getcwd()) 
infile = "myfile.txt" 

important = [] 
keep_phrases = ["Host", 
       "User-Agent" 
       ] 

with open(infile) as f: 
    f = f.readlines() 

for line in f: 
    for phrase in keep_phrases: 
     if phrase in line: 
      important.append(line) 

      break 
#print(type(important)) 
print(important) 
#Counter(important) 
pd.DataFrame(important) 

Dies gibt mir keine Ausgabe in zwei Spalten. Ich suche Host und User Agent als eine Zeile.

Beispiel der Textdatei wie unten

15 SessionOpen c aa.bb.cc.ddd 62667 :8080 
    15 SessionClose c pipe 
    15 ReqStart  c aa.bb.cc.ddd 62667 442374415 
    15 RxURL  c /61665002001003_001/CH4_08_02_24_61665002001003_001_16x9_1500000_Seg1-Frag666 
    15 RxHeader  c Host: ll.abrstream.channel4.com 
    15 RxHeader  c Connection: keep-alive 
    15 RxHeader  c User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 
    15 RxHeader  c X-Requested-With: ShockwaveFlash/21.0.0.216 
    15 RxHeader  c Accept: */* 
    15 RxHeader  c Referer: http://www.channel4.com/programmes/the-tiny-tots-talent-agency/on-demand/61665-002 
    15 RxHeader  c Accept-Encoding: gzip, deflate, sdch 
    15 RxHeader  c Accept-Language: en-US,en;q=0.8 
    15 ReqEnd  c 442374415 1461870946.496117592 1461870947.112555504 0.000315428 0.001363039 0.615074873 
    15 SessionOpen c aa1.bb1.cc1.ddd1 59409 :8080 
    15 SessionClose c pipe 
    15 ReqStart  c aa1.bb1.cc1.ddd1 59409 442374416 
    15 RxURL  c /gpsApi.php 
    15 RxHeader  c Content-Length: 0 
    15 RxHeader  c Host: map.yanue.net 
    15 RxHeader  c Connection: Keep-Alive 
    15 RxHeader  c User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 
    15 ReqEnd  c 442374416 1461870950.580444574 1461870951.139206648 0.000064135 0.001196861 0.557565212 
    15 SessionOpen c aa1.bb1.cc1.ddd1 52179 :8080 
    15 SessionClose c pipe 
    15 ReqStart  c aa1.bb1.cc1.ddd1 52179 442374417 
    15 RxURL  c /gpsApi.php 
    15 RxHeader  c Content-Length: 0 
    15 RxHeader  c Host: map.yanue.net 
    15 RxHeader  c Connection: Keep-Alive 
    15 RxHeader  c User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 
    15 ReqEnd  c 442374417 1461870951.776547432 1461870952.448071241 0.000062943 0.001109123 0.670414686 
    18 SessionOpen c aa.bb.cc.ddd 62670 :8080 
    18 SessionClose c pipe 
    18 ReqStart  c aa.bb.cc.ddd 62670 442374418 
    18 RxURL  c /61665002001003_001/CH4_08_02_24_61665002001003_001_16x9_1500000_Seg1-Frag667 
    18 RxHeader  c Host: ll.abrstream.channel4.com 
    18 RxHeader  c Connection: keep-alive 
    18 RxHeader  c User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 
    18 RxHeader  c X-Requested-With: ShockwaveFlash/21.0.0.216 
    18 RxHeader  c Accept: */* 
    18 RxHeader  c Referer: http://www.channel4.com/programmes/the-tiny-tots-talent-agency/on-demand/61665-002 
    18 RxHeader  c Accept-Encoding: gzip, deflate, sdch 
    18 RxHeader  c Accept-Language: en-US,en;q=0.8 
    18 ReqEnd  c 442374418 1461870951.920178175 1461870952.507097483 0.001731873 0.001337051 0.585582256 
    15 SessionOpen c aa1.bb1.cc1.ddd1 48034 :8080 
    15 SessionClose c pipe 
+0

Hey @manisha, der Code und die Textdatei in Ihrem Post ist nicht richtig formatiert. Bitte brich wenigstens die Zeilen. Auch was soll der Index sein, sagen Session ID? – zaxliu

+0

@zaxliu, Es sollte jetzt besser aussehen – manisha

+0

Zu dieser Zeit war ich gerade auf der Suche nach diesen beiden Spalten, – manisha

Antwort

1

können Sie einen Datenrahmen erstellen, indem Sie eine Liste von Listen erstellen, und dann den Datenrahmen Konstruktor verwenden.

Wiederholen Sie jede Zeile der Datei, wie Sie es begonnen haben, und teilen Sie dann jede Zeile in die verschiedenen Spalten auf. Sie können re.split verwenden, um eine Liste der Spalten zu erstellen und die maximale Anzahl der Aufteilungen zu begrenzen, um die letzte Spalte als ein Element zu behandeln. Wenn Sie jedoch wissen, dass jedes Element immer auf die gleiche Weise ausgerichtet wird, können Sie diese Liste mithilfe von Slicing erstellen.

import re 

df_list = [] 
with open(infile) as f: 
    for line in f: 
     # remove whitespace at the start and the newline at the end 
     line = line.strip() 
     # split each column on whitespace 
     columns = re.split('\s+', line, maxsplit=4) 
     df_list.append(columns) 

Anschließend können Sie das Verfahren in this answer verwenden, um den Datenrahmen zu erstellen.

df = pd.DataFrame(df_list) 
Verwandte Themen