1

我有这个由 3 个函数组成的类。每个功能负责整个过程的一部分。

.load()加载两个文件,重新格式化它们的内容并将它们写入两个新文件。

.compare()获取两个文件并以特定格式打印出它们的差异。

.final()获取结果.compare()并为每组值创建一个文件。

请忽略逻辑的科学怪人性质,因为这不是我目前主要关心的问题。我知道它可以写得更好一千倍,这对我来说很好,因为我对 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.load()应该输出两个文件,调用.compare()传递这两个文件的函数。

然后当.compare()完成时,它应该传递.final()输出文件并调用它。

因此,.final()将打开传递给它的任何文件,.compare()而不是"test123.txt"上面定义的文件。

我希望这一切都有意义。如果您需要澄清,请告诉我。欢迎对代码本身提出任何批评。提前致谢。

4

4 回答 4

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)

查看您的代码,我认为您的负载有问题。您只需声明一个字典,然后将两个文件的内容加载到其中并将相同的内容写入两个文件。因为每个文件都有相同的内容,比较不会做任何有意义的事情。

另外,你真的想写出文件内容然后重新读入内存吗?我会将帧定义保留在内存中,以便在加载后进行比较,而不是重新读取它们。

我真的不认为这是一个类的原因,而不仅仅是三个函数,但也许如果你必须读取多个格式略有不同的文件,你可以从使用类属性来定义格式中获得一些好处同时继承一般逻辑。

于 2013-06-04T18:42:59.300 回答
3

你的意思是调用这两个文件的名称吗?那么你定义了一个类,所以你可以这样做:

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

等等。

于 2013-06-04T18:39:25.810 回答
1

我可能完全不在这儿,但你为什么不完全按照你说的去做呢?

只需调用self.compare()你的load()方法。

您还可以将 return 语句添加到文件load()并返回 atuple文件。

然后将第四个方法添加到您的类中,然后收集返回的文件并将它们通过管道传递给该compare()方法。

此致!

于 2013-06-04T18:42:28.893 回答
1

Python 更强大的方面之一是您可以返回称为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')

*每个函数接受两个命名参数,但第一个返回的元组可以通过在它前面添加 a 来“解压缩”到第二个的输入参数中。

于 2013-06-04T18:45:56.353 回答