从其他函数传递值和调用函数

时间:2013-06-04 18:28:06

标签: python python-2.7

我有这个由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]))

现在我的问题是,我如何制作它,以便每个函数将它的输出文件作为值传递给下一个函数并调用它?

举个例子:

运行.load()应输出两个文件,调用.compare()函数将这两个文件传递给它。

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

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

我希望这一切都有道理。如果您需要澄清,请告诉我。关于代码本身,任何批评都是受欢迎的。提前谢谢。

4 个答案:

答案 0 :(得分:3)

你的意思是用这两个文件的名字打电话?你定义了一个类,所以你可以这样做:

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

等等。

答案 1 :(得分: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不会做任何有意义的事情。

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

我真的没有理由认为这是一个类而不仅仅是三个函数,但是如果你必须阅读具有稍微不同格式的多个文件,你可以获得使用类属性的一些好处在继承一般逻辑的同时定义格式。

答案 2 :(得分:1)

我可能完全不在这里,但你为什么不像你说的那样完成呢?

只需使用self.compare()方法拨打load()

您还可以将退货语句添加到load()并返回tuple文件。

然后向您的类添加第4个方法,然后收集返回的文件并将它们传递给compare()方法。

最诚挚的问候!

答案 3 :(得分: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')

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