2013-06-04 2 views
1

이 클래스는 3 개의 함수로 구성됩니다. 각 기능은 전체 프로세스의 한 부분을 담당합니다.다른 함수에서 값 및 호출 함수 전달

.load()은 두 개의 파일을로드하고 내용의 형식을 다시 지정하며 두 개의 새 파일에 씁니다.

.compare()은 두 개의 파일을 가져 와서 특정 형식의 차이점을 인쇄합니다.

.final().compare()의 결과를 취하여 모든 값 집합에 대한 파일을 만듭니다.

논리의 Frankenstein 특성을 무시하십시오. 현재로서는 내 관심사가 아닙니다. 나는 그것이 천 번 더 좋게 쓰여질 수 있다는 것을 안다. 그리고 나는 여전히 파이썬에 대해 처음이고 일반적으로 프로그래밍하기 때문에 나에게는 괜찮다. 나는 이론적 인 경험이 있지만 기술적 인면이 매우 제한되어 있고 그것이 내가 작업하고있는 어떤 것입니다. 내가 어떻게 그렇게 각 함수는 다음 함수 값으로 출력 파일을 그리고 그것을 호출 통과해야합니까, 내 질문에 이제

from collections import defaultdict 
from operator import itemgetter 
from itertools import groupby 
from collections import deque 
import os 


class avs_auto: 


    def load(self, fileIn1, fileIn2, fileOut1, fileOut2): 
     with open(fileIn1+'.txt') as fin1, open(fileIn2+'.txt') as fin2: 
      frame_rects = defaultdict(list) 
      for row in (map(str, line.split()) for line in fin1): 
       id, frame, rect = row[0], row[2], [row[3],row[4],row[5],row[6]] 
       frame_rects[frame].append(id) 
       frame_rects[frame].append(rect) 
      for row in (map(str, line.split()) for line in fin2): 
       id, frame, rect = row[0], row[2], [row[3],row[4],row[5],row[6]] 
       frame_rects[frame].append(id) 
       frame_rects[frame].append(rect) 

     with open(fileOut1+'.txt', 'w') as fout1, open(fileOut2+'.txt', 'w') as fout2: 
      for frame, rects in sorted(frame_rects.iteritems()): 
       fout1.write('{{{}:{}}}\n'.format(frame, rects)) 
       fout2.write('{{{}:{}}}\n'.format(frame, rects)) 

    def compare(self, f1, f2): 
     with open(f1+'.txt', 'r') as fin1: 
      with open(f2+'.txt', 'r') as fin2: 
       lines1 = fin1.readlines() 
       lines2 = fin2.readlines() 
       diff_lines = [l.strip() for l in lines1 if l not in lines2] 
       diffs = defaultdict(list) 
       with open(f1+'x'+f2+'Result.txt', 'w') as fout: 
        for line in diff_lines: 
         d = eval(line) 
         for k in d: 
          list_ids = d[k] 
          for i in range(0, len(d[k]), 2): 
           diffs[d[k][i]].append(k) 
        for id_ in diffs: 
         diffs[id_].sort() 
         for k, g in groupby(enumerate(diffs[id_]), lambda (i, x): i - x): 
          group = map(itemgetter(1), g) 
          fout.write('{0} {1} {2}\n'.format(id_, group[0], group[-1])) 

    def final(self): 
     with open('hw1load3xhw1load2Result.txt', 'r') as fin: 
      lines = (line.split() for line in fin) 
      for k, g in groupby(lines, itemgetter(0)): 
       fst = next(g) 
       lst = next(iter(deque(g, 1)), fst) 
       with open('final/{}.avs'.format(k), 'w') as fout: 
        fout.write('video0=ImageSource("MovieName\original\%06d.jpeg", {}, {}, 15)\n'.format(fst[1], lst[2])) 

: 여기

코드인가? 그래서 예를 들어

는 :

.load()해야 출력이 개 파일을 실행

, 그것을 두 파일을 통과하는 .compare() 함수를 호출합니다.

그러면 .compare()이 완료되면 .final() 출력 파일을 전달하고이를 호출해야합니다.

그래서 .final()은 위에 정의 된대로 .compare()이 아닌 어떤 파일도 "test123.txt"에서 열립니다.

나는 이것이 모두 의미가 있기를 바랍니다. 설명이 필요한 경우 알려주십시오. 코드 자체에 대한 비판을 환영합니다. 미리 감사드립니다.

답변

3

이렇게하는 데는 몇 가지 방법이 있지만 다른 세 가지를 차례로 호출하는 마스터 함수를 작성합니다.다음과 같음 :

def load_and_compare(self, input_file1, input_file2, output_file1, output_file2, result_file): 
    self.load(input_file1, input_file2, output_file1, output_file2) 
    self.compare(output_file1, output_file2) 
    self.final(result_file) 

코드를 살펴보면 문제가있는 것 같습니다. 하나의 사전 만 선언 한 다음 두 파일의 내용을이 파일에로드하고 동일한 내용을 두 개의 파일에 기록합니다. 각 파일의 내용이 동일하기 때문에 compare는 의미있는 작업을 수행하지 않습니다.

또한 파일 내용을 기록한 다음 메모리로 다시 읽으려고합니까? 로드 후 비교에서 사용하기 위해 프레임 정의를 다시 읽는 대신에 사용할 수 있습니다.

저는이 기능이 단지 트리오가 아닌 클래스라고 생각합니다. 어쩌면 약간 다양한 형식으로 여러 파일을 읽어야하는 경우 일반 논리를 상속하는 동안 클래스 특성을 사용하여 형식을 정의 할 때 얻을 수있는 이점을 얻을 수 있습니다.

+0

예, 내 부하에서 문제가 발생 했으므로 고맙습니다. 내 유일한 문제는 어떻게 내가 "result_file"final을 open() 라인으로 전달 하는가하는 것입니다. 내가 그렇게한다면 : "with open (result_file + '. txt', 'r') fin :"파일이나 디렉토리를 반환하지 않습니다 ". 나를 올바른 방향으로 인도 할 수 있습니까? – MaxPower

+1

글쎄, 그 오류는 그것이 예상 파일을 찾지 못한다는 것을 의미합니다 - 당신이 그것을주는 위치에 존재하는지 확인해야합니다. 그게'compare'의 결과물이라면, master 함수에서 예상되는 파일 이름을 만들고 아마도 compare와 final의 인수로 넘겨 주면됩니다. –

3

두 파일의 이름을 부르겠습니까? 클래스를 정의 했으므로 다음과 같이하면됩니다.

def load(self, fileIn1, fileIn2, fileOut1, fileOut2): 
    ... // do stuff here 
    // when done 
    self.compare(fileOut1, fileOut2) 

등등.

1

내가 완전히 여기에서 벗어 났을 수도 있지만, 말한대로 정확히하지 않으시겠습니까?

load() 메소드에서 self.compare()으로 전화하면됩니다.

load()에 return 문을 추가하고 파일에 tuple을 반환 할 수도 있습니다.

그런 다음 네 번째 방법을 클래스에 추가하면 클래스가 리턴 된 파일을 수집하여 compare() 메소드로 파이프합니다.

최고 감사합니다.

1

파이썬의보다 강력한면 중 하나는 tuple이라는 것을 반환 할 수 있다는 것입니다. 더 일반적인 파이썬 의미에서이 대답하려면이 코드를 고려하십시오

>>> def load(file1, file2): 
     return file1+'.txt',file2+'.txt' 

>>> def convert(file1, file2): 
     return 'converted_'+file1,'converted_'+file2 

>>> convert(*load("Java", "C#")) 
('converted_Java.txt', 'converted_C#.txt') 

각 기능이 개 명명 된 인수 걸리지 만, 처음의 반환 튜플은 *을 추가하여 두 번째의 입력 인수로 "압축 해제"할 수있다 그것 앞에.

관련 문제