具有多个数据输入的类

时间:2012-02-15 23:29:00

标签: python

利用课程的新手。

如果我有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)

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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']