crear encabezados csv desde el archivo de registro python

Mi archivo de registro contiene información en cada fila como a continuación

Info1:NewOrder|key:123 |Info3:10|Info5:abc Info3:10|Info1:OldOrder| key:456| Info6:xyz Info1:NewOrder|key:007 

Quiero cambiarlo a un csv como abajo (si doy la clave, Info1, Info3 como encabezados requeridos)

 key,Info1.Info3 123,NewOrder,10 456,OldOrder,10 007,NewOrder, 

Anteriormente usé awk para obtener valores de campo, pero el registro puede cambiar el orden de la información y la clave impresa en una fila. Así que no puedo estar seguro de que Info3 siempre esté en alguna columna en particular. Cada vez que el registro cambia, el script necesita ser cambiado.

Tengo la intención de cargar csv en el dataframe de pandas. Así que una solución de python sería mejor. Esto es más una tarea de limpieza de datos para generar un csv desde el archivo de registro.

Esto es lo que he usado después de leer las respuestas.

 import csv import sys with open(sys.argv[1], 'r') as myLogfile: log=myLogfile.read().replace('\n', '') requested_columns = ["OrderID", "TimeStamp", "ErrorCode"] def wrangle(string, requested_columns): data = [dict([element.strip().split(":") for element in row.split("|")]) for row in string.split("\n")] body = [[row.get(column) for column in requested_columns] for row in data] return [requested_columns] + body outpath = sys.argv[2] open(outpath, "w", newline = "") with open(outpath, 'wb') writer = csv.writer(file) writer.writerows(wrangle(log, requested_columns)) 

Ejemplo de archivo de registro = https://ideone.com/cny805

Podría utilizar un lector csv con un | delimitador para comenzar, luego divídalo usando : para obtener un diccionario por fila de la siguiente manera:

 import csv with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output: csv_output = csv.writer(f_output) cols = ["OrderID", "TimeStamp", "ErrorCode"] csv_output.writerow(cols) for row in csv.reader(f_input, delimiter='|'): # Remove any entries that do not have a colon row = [c for c in row if c.find(':') != -1] # Convert remaining columns into a dictionary entries = {c.split(':')[0].strip() : c.split(':')[1].strip() for c in row} csv_output.writerow([entries.get(c, "") for c in cols]) 

Dándole un archivo de salida:

 OrderID,TimeStamp,ErrorCode 3000000,1488948188555841641, 3000000,1488948188556444675,0 

Para leer los datos directamente en un dataframe de Pandas:

 import pandas as pd import csv cols = ["OrderID", "TimeStamp", "ErrorCode"] data = [] with open('input.csv', 'rb') as f_input: csv_output = csv.writer(f_output) for row in csv.reader(f_input, delimiter='|'): # Remove any entries that do not have a colon row = [c for c in row if c.find(':') != -1] # Convert remaining columns into a dictionary entries = {c.split(':')[0].strip() : c.split(':')[1].strip() for c in row} data.append([entries.get(c, "") for c in cols]) df = pd.DataFrame(data, columns=cols) print df 

Dandote:

  OrderID TimeStamp ErrorCode 0 3000000 1488948188555841641 1 3000000 1488948188556444675 0 

La mayor parte está utilizando métodos de cadena útiles, como separar y dividir, además de listas de comprensión.

 import csv string = """Info1=NewOrder|key=123 |Info3=10|Info5=abc Info3=10|Info1=OldOrder| key=456| Info6=xyz Info1=NewOrder|key=007""" requested_columns = ["key", "Info1", "Info3"] def wrangle(string, requested_columns): data = [dict([element.strip().split("=") for element in row.split("|")]) for row in string.split("\n")] body = [[row.get(column) for column in requested_columns] for row in data] return [requested_columns] + body outpath = "whatever.csv" with open(outpath, "w", newline = "") as file: writer = csv.writer(file) writer.writerows(wrangle(string, requested_columns))