1

3つの関数で構成されるこのクラスがあります。各機能は、プロセス全体の一部を担当します。

.load()2 つのファイルをロードし、それらのコンテンツを再フォーマットして、2 つの新しいファイルに書き込みます。

.compare()は 2 つのファイルを取得し、それらの違いを特定の形式で出力します。

.final()の結果を.compare()取得し、値のセットごとにファイルを作成します。

現時点では私の主な関心事ではないため、ロジックのフランケンシュタインの性質は無視してください。私はそれが1000倍良く書けることを知っています。私はまだPythonとプログラミング全般に慣れていないので、今のところそれで問題ありません。理論的な経験はありますが、技術的な実践は非常に限られています。それは私が取り組んでいるものです。

コードは次のとおりです。

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]))

私の質問に、各関数が出力ファイルを値として次の関数に渡し、それを呼び出すようにするにはどうすればよいですか?

たとえば、次のようになります。

runningは 2 つのファイルを出力し、それらの 2 つのファイルを渡す関数を.load()呼び出します。.compare()

が完了すると、出力ファイルを.compare()渡して呼び出す必要があります。.final()

そのため、上記で定義されたものではなく、.final()渡されたファイルを開きます。.compare()"test123.txt"

これがすべて理にかなっていることを願っています。説明が必要な場合はお知らせください。コード自体に関する批判は大歓迎です。前もって感謝します。

4

4 に答える 4

1

Python のより強力な側面の 1 つは、 tupleと呼ばれるものを返すことができることです。より一般的な Python の意味でこれに答えるには、次のコードを検討してください。

>>> 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')

各関数は 2 つの名前付き引数を取りますが、最初のタプルから返されたタプルは、その*前に a を追加することにより、2 番目の入力引数に「アンパック」できます。

于 2013-06-04T18:45:56.353 に答える