2012-02-15 4 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

+1

데이터를 채운 후 데이터로 수행하려는 작업을 알려주시겠습니까? 큰 그림은 무엇입니까? 데이터는 나중에 어떻게 사용됩니까? 데이터 구조가 잘못되었을 가능성이 높으므로 데이터를 구문 분석하는 방법에 대한 질문은 도움이되지 않습니다. – Irfy

+0

'for_file1' 루프의 모든 반복에서'f0'을 덮어 쓰고 있기 때문에'set_f0'로 무엇을 하려는지 확실하지 않습니다. 당신이하려는 것을 설명하십시오. – Edwin

답변

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

저는 그가 한 차원이 파일이고, 두 번째 차원이 열이고, 세 번째 차원이 선인 준 3 차원 공간을 원할 수 있다고 생각했습니다. 그것은 나에게 보이지만, 나는 단서가 없다 ... 당신의 접근 방식은 분명히 그와는 다른 것을하지만, 결과가 무엇인지 명확하지 않다는 것에 동의한다. – Irfy

+1

@Irfy : 오늘 밤 크리스탈 볼이 조금 흐려서 모르겠다. 나는 그 모든 f_i와 함께 OP가 그저 모든 칼럼을 보았을 것이라고 생각했지만, 헤이 .. 누가 알 겠어? –

+0

@jcollado 및 rik poggi : 이것은 훨씬 더 의미가 있습니다. 내가 그 문제를 지나치게 복잡하게 만든다고 가정 해 봅시다. 그러나, 나는 클래스가 목록이나 사전과 반대로 사용될 때와 여러 개의 데이터 세트로 클래스를 올바르게 채우는 방법을 이해하려고 노력하고있다. 가난한 사례를 유감스럽게 생각합니다. – NewToPy

1

내가 방법을 생각한다 데이터를 가져오고 설정하는 것이 필요 이상으로 복잡합니다. 예를 들어, 모든 요소 I는 다음과 같은 것 인 목록의 각 인스턴스 오브젝트에 설정 얻기 위해 :

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'] 
관련 문제