2017-06-29 6 views
0

Ich habe eine Protokolldatei, die etwa 1,5 GB ist. Die Datei enthält Protokolldaten in folgendem Format:Parsing Log-Datei in Python und Speichern in Csv

A|B|C|D delimited by '|' character and does not have column names. It has only 
four columns 

Wie kann ich es analysieren 3.6 Python und es dann exportieren Datei in CSV und benutzerdefinierte Spaltennamen hinzuzufügen. Wie begrenzen Sie die Anzahl der Zeilen beim Exportieren in CSV-Datei.

Ich habe begonnen, wie unten den Code zu schreiben, aber nicht wissen, wie weiter verfahren ist:

import re 
import pandas as pd 
from pandas import ExcelWriter 

infile = r"D:\Sys\file.log" 

df = pd.DataFrame() 
with open(infile,encoding="ISO-8859-1") as f: 
    f = f.readlines() 

for line in f: 
    print(line) 

Ich bin in der Lage, die Linien zu bekommen, wie ich es mit print-Anweisung überprüft.

+0

Kann diese Spalten * auch möglicherweise haben '|' in ihnen? Wenn nicht, können Sie einfach auf dieses Trennzeichen aufteilen. –

+0

Keine Zeilen haben kein "|" Trennzeichen. Wie man Trennzeichen verwendet und in CSV speichert –

+0

Okay, und was willst du mit Pandas machen? –

Antwort

3

Hier ist eine Lösung, die Pandas nicht beinhalten:

import csv 

with open(r"D:\Sys\file.log", encoding="ISO-8859-1") as f, open('logfile.csv', 'w') as f2: # or 'wb' if on python2 
    writer = csv.writer(f2) 
    writer.writerow(['Index', 'A', 'B', 'C', 'D']) # replace with your custom column header 

    i = 0 
    for line in f: 
     writer.writerow([i] + line.rstrip().split('|')) 
     i += 1 
     if i == 10000: 
      break 

Verwenden csv.writer zum Schreiben von Daten in eine Datei im CSV-Format.

+0

io.UnsupportedOperation: nicht beschreibbar –

+0

@Olay: Sorry, versuche es noch einmal. Es gab ein paar Probleme vorher. –

+0

Kann ich die Anzahl der Zeilen wie 10000 begrenzen, denn wenn ich alle Zeilen anhefte, wird die CSV-Datei sehr groß sein. –

1

Da Ihr Protokoll ein gutes Format hat, können Sie csv.reader verwenden, um es zu lesen. Und dann schreiben Sie es um.Sie können es mit csv.writer schreiben.

import csv 
with open('csv.log', 'r') as logfile, open('output.csv', 'w') as csvfile: 
    reader = csv.reader(logfile, delimiter='|') 
    writer = csv.writer(csvfile, delimiter='|',) 
    writer.writerow(['column1', 'column2', 'column3', 'column4']) 
    writer.writerows(reader) 

refference:
Reader Objects
Writer Objects

+0

Das Wort 'Spam' und' Eier' im Code kann nur bedeuten, dass es aus den offiziellen Dokumenten stammt. Nichts falsch daran ... nur zu sagen. –

+0

Ja, ich habe gerade die offiziellen Dokumente gelesen und festgestellt, dass dies funktioniert. Ich werde die URL der offiziellen Dokumente zur Antwort hinzufügen. – xiaoyi

+0

@Coldspeed danke, ich habe die Wörter geändert, damit es besser aussieht. – xiaoyi

0

Mit Pandas, können Sie erreichen, was Sie mit dem folgenden Code wollen:

import pandas 
chunk_size = 10000 
custom_headers = ["custheader-1", "custheader-2", "custheader-3", "custheader-4"] 
reader = pandas.read_table("log.txt", sep="|", header=None, chunksize=chunk_size) 
for index, chunk in enumerate(reader): 
    if (index == 0): 
     chunk.to_csv("out.csv", index=False, sep="|", header=custom_headers) 
    else: 
     chunk.to_csv("out.csv", index=False, mode='a', sep="|", header=False)