我有这个由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"
,如上所述。
我希望这一切都有道理。如果您需要澄清,请告诉我。关于代码本身,任何批评都是受欢迎的。提前谢谢。
答案 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')
每个函数都有两个命名参数,但第一个返回的元组可以通过在它前面添加*
“解包”到第二个的输入参数中。