Ich habe etwa 5000 .gz-Dateien, aus denen ich die Daten in Form von "Liste der Wörterbücher" extrahieren muss.Python: Erstelle Datei aus der Liste der Wörterbücher
Beispielquelldaten:
{"user" : "J101", "ip" : "192.0.0.0", "usage" : "1000", "Location" : "CA",
"time" : "12038098048"}
{"user" : "M101", "ip" : "192.0.0.1", "usage" : "5000",
"time" : "12038098048", "Device" : "iOS" , "user_type" : "Premium"}
{"user" : "T101", "usage" : "10", "Location" : "AK","time" : "12038098048"}
{"user" : "A101", "ip" : "192.0.0.3", "usage" : "2000",
"time" : "12038098048", "user_type" : "Platinum" }
{"user" : "T101", "usage" : "10", "Location" : "AK","time" : "12038098048"}
{"user" : "J101", "ip" : "192.0.0.0", "usage" : "1000", "Location" : "CA",
"time" : "12038098048" }
Jede Zeile oben stellt die Daten für ein bestimmtes Ereignis; Benutzer J101
und T101
berichtet Daten zweimal, so dass sie jeweils 2 Zeilen haben.
Ich bin in der Anfangsphase des Schreibens von Code dies, also begann ich durch Extrahieren von Daten aus 1. GZ und versuchen zu sehen, ob ich die Daten von Interesse analysieren und erstellen Sie eine TXT-oder CSV-Datei.
Meine Forderung ist nur wenige Attribute aus diesen Dateien zu erhalten, wie user
, ip
, time
und usage
.
Unten ist der Code, den ich schrieb, um die Daten aus .gz-Datei zu extrahieren und die Daten in Form einer Liste von Wörterbüchern zu speichern.
import gzip
from collections import defaultdict
import json
import csv
e_dict = { 'userid' : { 'e_name' : 'user'},
'ipaddr' : { 'e_name' : 'ip' },
'event_time' : { 'e_name' : 'time' },
'usage_in_mb' : { 'e_name' : 'usage' }
}
dict_list = []
inputdict = defaultdict(lambda: None)
count_valueerror = 0
class parser(object):
def read_entries(self):
count = 0
with gzip.open('testfile.gz', 'r') as test:
for row in test:
try:
# Few rows are empty in the source file and have a new line character
if row == "\n":
continue
else:
# Changing the type of each row in file to string type for parsing dictionary
row_new = json.loads(row)
for key, val in e_dict.iteritems():
if val['e_name'] in row_new:
inputdict[key] = row_new[val['e_name']]
except ValueError:
count_valueerror += 1
dict_list.append(inputdict)
def create_csv(self):
with open('dict.csv', 'wb') as csv_file:
for row in dict_list:
for key, val in row:
csvwriter = csv.DictWriter(csv_file, fieldnames= row.keys(), extrasaction='raise', dialect='excel')
csvwriter.writeheader()
csvwriter.writerows(val)
return csv_file
Die create_csv
Methode funktioniert nicht richtig. Ich bin nicht sicher, wie man das dict_list
analysiert und jedes Wörterbuchobjekt nimmt, um es in csv/Textdatei zu schreiben.
Ich bekomme diesen Fehler ValueError: dict contains fields not in fieldnames: 'p
für create_csv
Methode.
Danke Oscar. Lass mich das versuchen. – Himanshu
Es funktioniert gut für den Fall, den ich in der Frage erwähnt habe. Vielen Dank. Aber ich suche nach einem dynamischen Ansatz, da die Anzahl der Spalten/Feldnamen nicht in jeder Zeile gleich ist. Ich möchte die Obermenge aller Feldnamen aus der .gz-Datei. @namwoojin erwähnt hier einen Ansatz mit Listen. Ich werde es jetzt versuchen. Suchen Sie auch nach einer Option, um das Ergebnis mit dict-Objekt zu erhalten. – Himanshu
Die 'fieldnames = dict_list [0] .keys()' in 'fieldnames = e_dict.keys()' wurde geändert und es funktioniert jetzt. Vielen Dank @Oscar. – Himanshu