2012-02-15 102 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'] 
相关问题