2012-02-15 51 views
-1

利用類的新功能。具有多個數據輸入的類

如果我有3個不同的文件爲這樣:

#test1.txt: 
a 100 xxx 
b 200 fff 
a 200 xxx 
c 500 fff 
a 200 www 

test2.txt: 
123 msg1 data2 
123 msg1 data3 
125 msg1 data2 
123 msg2 data5 
128 msg3 data2 

test3.txt: 
jan 5 79 
jan 5 80 
dec 5 79 
dec 12 79 
feb 5 80 

,我想填充在1類中的所有數據,同時通過文件迭代,這是正確的做法?

我有困難搞清楚如何填充所有的數據,而不會覆蓋和提取基於任何單個參數。

class DInput: 
    def set_f0(self, f0): 
     self.f0=f0 
     self.f1,f2,f3,f4,f5,f6,f7,f8=[] 
    def add_f1(self, f1): 
     self.f1.append(f1) 
    def add_f2(self, f2): 
     self.f2.append(f2) 
    def add_f3(self, f3): 
     self.f3.append(f3) 
    def add_f4(self, f4): 
     self.f4.append(f4) 
    def add_f5(self, f5): 
     self.f5.append(f5) 
    def add_f6(self, f6): 
     self.f6.append(f6) 
    def add_f7(self, f7): 
     self.f7.append(f7) 
    def add_f8(self, f8): 
     self.f8.append(f8) 

call = DInput() 

with open('test1.txt','r') as file1, open('test2.txt','r') as file2, open('test3.txt','r') as file3: 
    for line in file1: 
     f0,f1,f2=line.split() 
     call.set_f0(f0) 
     call.add_f1(f1) 
     call.add_f2(f2) 
    for line in file2: 
     f3,f4,f5=line.split() 
     call.add_f3(f3) 
     call.add_f4(f4) 
     call.add_f5(f5) 
    for line in file3: 
     f6,f7,f8=line.split() 
     call.add_f6(f6) 
     call.add_f7(f7) 
     call.add_f8(f8) 
+0

'self.f1,F2,F3,F4, f5,f6,f7,f8 = []' 那不行。它只會將'f1'設置爲對象變量。其餘的都是本地的。 – Irfy 2012-02-15 23:34:25

+1

您可以在填充後告訴我們您想要對數據做什麼嗎?什麼是大局,數據將在以後如何使用?你的數據結構很可能是錯誤的,所以如何解析數據的問題對你無能爲力。 – Irfy 2012-02-15 23:43:44

+0

不確定你想用'set_f0'做什麼,因爲你在'for file1'循環的每一次迭代中覆蓋'f0'。請解釋你正在嘗試做什麼。 – Edwin 2012-02-16 00:08:20

回答

1

有點難以分辨你想做什麼,但看起來你根本不需要類。

我想你的所有文件都有相同數量的行,而你基本上正在嘗試合併它們。

如果這是你的話,也許你正在尋找的東西,如:

from collections import defaultdict 

files = ['test1.txt', 'test2.txt', 'test3.txt'] 

data = defaultdict(list) 

for filename in files: 
    with open(filename) as f: 
     for i,line in enumerate(f): 
      data[i].extend(line.split()) 

我已經測試它在你的文件,例如,和我:

>>> for i in sorted(data): 
...  print(data[i]) 
['a', '100', 'xxx', '123', 'msg1', 'data2', 'jan', '5', '79'] 
['b', '200', 'fff', '123', 'msg1', 'data3', 'jan', '5', '80'] 
['a', '200', 'xxx', '125', 'msg1', 'data2', 'dec', '5', '79'] 
['c', '500', 'fff', '123', 'msg2', 'data5', 'dec', '12', '79'] 
['a', '200', 'www', '128', 'msg3', 'data2', 'feb', '5', '80'] 
+0

我以爲他可能想要一個準三維空間,一維是文件,二維是列,第三維是線。它看起來對我來說,但我不知道......你的方法肯定會做與他不同的事情,但我同意目前尚不清楚結果應該如何。 – Irfy 2012-02-15 23:39:00

+1

@Iffy:今晚我的水晶球有點多雲,所以我不知道。我認爲,所有這些「f_i」OP都只是單獨看着每一列,但是嘿......誰知道呢? – 2012-02-16 00:19:15

+0

@jcollado和rik poggi:這更有意義;假設我過於複雜的問題。然而,我想了解何時應該使用類而不是列表或字典,以及如何正確填充具有多個數據集的類。對不起這個不好的例子。 – NewToPy 2012-02-16 04:37:25

1

我的思維方式你會得到並設置你的數據比需要的更復雜。例如,爲了得到所有的元素以在列表中的每個實例對象設置我將在以下內容:

from itertools import izip, chain 

files = [open('test{0}.txt'.format(i)) for i in range(1,4)] 
for lines in izip(*files): 
    lines = chain.from_iterable([line.strip().split() 
           for line in lines]) 
    print list(lines) 

輸出示例:

['a', '100', 'xxx', '123', 'msg1', 'data2', 'jan', '5', '79'] 
['b', '200', 'fff', '123', 'msg1', 'data3', 'jan', '5', '80'] 
['a', '200', 'xxx', '125', 'msg1', 'data2', 'dec', '5', '79'] 
['c', '500', 'fff', '123', 'msg2', 'data5', 'dec', '12', '79'] 
['a', '200', 'www', '128', 'msg3', 'data2', 'feb', '5', '80'] 
相關問題