2016-06-23 13 views
0

ich eine Textdatei, die als solche formatiert ist:Erstellen von Objekten in Python innerhalb einer formatierten Textdatei

T timestamp 
U username 
W text 

Gibt es eine Möglichkeit, ein Objekt in der Textdatei mit den T U und W sind Attribute zu schaffen? Ich habe nur Scripting in Python und nichts objektorientiert gemacht, also bin ich ein bisschen verloren.

Ich muss diese riesige Textdatei analysieren und lese gerade die Datei Zeile für Zeile nach dem Attribut 'W', aber es könnte nützlicher sein, das gesamte Objekt zu haben.

edit: es sieht aus wie diese

total number:18572084 
T 2009-06-01 21:43:59 
U http://twitter.com/burtonator 
W No Post Title 

T 2009-06-01 21:47:23 
U http://twitter.com/burtonator 
W No Post Title 

T 2009-06-02 01:15:44 
U http://twitter.com/burtonator 
W No Post Title 

T 2009-06-02 05:17:52 
U http://twitter.com/burtonator 
W No Post Title 
+4

Was meinst du * "in der Textdatei" *? Meinst du * aus * der Textdatei? Natürlich können Sie eine Linie analysieren, einige Werte extrahieren und sie in ein Objekt umwandeln. – jonrsharpe

+1

ist -jeder-Eins-Eintrag- wird genau die gleiche "T, U, W" haben? – TehTris

+1

Wiederholt sich das Muster von "T Zeitstempel \ nU Benutzername \ nW Text" in der gesamten Datei? Gibt es Leerzeilen zwischen diesen Dreiergruppen? Sehen mehr Eingabetext wäre hilfreich. – jDo

Antwort

0

Sie brauchen nur einen Weg von d oing es aber hier sind zwei Varianten und eine Funktion einzelne Datei lesen, die nicht auf einmal die gesamte Datei nicht lesen (es speichert 3-4 Zeilen höchstens):

# **kwarg is a dictionary. It can hold any number of keyword arguments. 
class obj1: 
    def __init__(self, **kwarg): 
     self.attributes = kwarg 

# t,u,v as actual class attributes 
class obj2: 
    def __init__(self, t, u, w): 
     self.t = t 
     self.u = u 
     self.w = w 

objects1 = [] 
objects2 = [] 

with open("input_file", "r") as f: 
    lines = [] 
    for line in f: 
     line = line.strip() 
     lines.append(line) 
     if line.startswith("W"): 
      objects1.append(obj1(t=lines[-3], u=lines[-2], w=lines[-1])) 
      objects2.append(obj2(t=lines[-3], u=lines[-2], w=lines[-1])) 
      lines = [] 


# same output but different ways of accessing the attributes 

for o in objects1: 
    print o.attributes["t"] 
    print o.attributes["u"] 
    print o.attributes["w"] 

for o in objects2: 
    print o.t 
    print o.u 
    print o.w 

Eingabedatei:

$ cat input_file 
total number:18572084 
T 2009-06-01 21:43:59 
U http://twitter.com/burtonator 
W No Post Title 

T 2009-06-01 21:47:23 
U http://twitter.com/burtonator 
W No Post Title 

T 2009-06-02 01:15:44 
U http://twitter.com/burtonator 
W No Post Title 
0

die Zeilen in Ihrem Dokument sind Raum, den Sie so etwas wie dies tun würde, getrennt Unter der Annahme:

class YourObj(object): 
    def __init__(self, t, u, w): 
     self.t = t 
     self.u = u 
     self.w = w 

all_objs = [] 

with open("somefile.txt") as f: 
    lines = f.readlines() 
    for i in range(len(lines)/3): 
     all_objs.append(YourObj(t=lines[i], u=lines[i+1], w=lines[i+2])) 

all_objs # all yours to work on now 
+0

Sie meinen wahrscheinlich 't = Linien [i * 3], u = Linien [i * 3 + 1], w = Linien [i * 3 + 2] 'oder alternativ' für i im Bereich (0, len (Zeilen), 3): ... '. – 6502

0

ich die Antwort von Luke mag, aber es sieht für mich als würden Sie etwas ähnliches für Ihr spezifisches Format benötigen:

class YourObj(object): 
    def __init__(self, dictionary): #init class with dictionary storing data 
     self.T = dictionary['T'] 
     self.U = dictionary['U'] 
     self.W = dictionary['W'] 

all_objs = [] 
with open("somefile.txt") as f: 
    lines = f.readlines() 
    for i in range(0, len(lines), 3): #read lines in groups of three 
     dic = {} 
     for j in range(3): 
      pieces = lines[i+j].split() 
      dic[pieces[0]] = pieces[1] #save data to dictionary 
     all_objs.append(YourObj(dic)) #make new object 
Verwandte Themen