2 つのテキスト ファイルを比較し、結果を 3 番目のファイルに出力します。スクリプトの CWD で、実行中のスクリプトが 2 つのテキスト ファイルを含むすべてのフォルダーを反復処理するようにしようとしています。
私がこれまでに持っているもの:
import os
import glob
path = './'
for infile in glob.glob( os.path.join(path, '*.*') ):
print('current file is: ' + infile)
with open (f1+'.txt', 'r') as fin1, open(f2+'.txt', 'r') as fin2:
これは反復プロセスを開始する良い方法でしょうか?
これは最も明確なコードではありませんが、仕事は完了します。ただし、読み取り/書き込みメソッドからロジックを取り除く必要があると確信していますが、どこから始めればよいかわかりません。
私が基本的にやろうとしているのは、CWD 内のすべてのフォルダーに対してスクリプトを反復処理し、各フォルダーを開き、内部の 2 つのテキスト ファイルを比較し、3 番目のテキスト ファイルを同じフォルダーに書き込み、次に移動することです。
私が試した別の方法は次のとおりです。
import os
rootDir = 'C:\\Python27\\test'
for dirName, subdirList, fileList in os.walk(rootDir):
print('Found directory: %s' % dirName)
for fname in fileList:
print('\t%s' % fname)
これにより、次のように出力されます (ファイル構造のより良い例を示すために:
Found directory: C:\Python27\test
test.py
Found directory: C:\Python27\test\asdd
asd1.txt
asd2.txt
Found directory: C:\Python27\test\chro
ch1.txt
ch2.txt
Found directory: C:\Python27\test\hway
hw1.txt
hw2.txt
の下に比較ロジックを配置するのが賢明でしょうfor fname in fileList
か? fnames
特定のフォルダ内の 2 つのテキスト ファイルを比較し、他のファイルと比較しないようにするにはどうすればよいfileList
ですか?
これは、この機能を追加しようとしている完全なコードです。私はそれのフランケンシュタインの性質をお詫びしますが、私はまだ洗練されたバージョンに取り組んでいますが、まだ動作しません.
from collections import defaultdict
from operator import itemgetter
from itertools import groupby
from collections import deque
import os
class avs_auto:
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)
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)
frame_rects2 = defaultdict(list)
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_rects2[frame].append(id)
frame_rects2[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))
for frame, rects in sorted(frame_rects2.iteritems()):
fout2.write('{{{}:{}}}\n'.format(frame, rects))
def compare(self, fileOut1, fileOut2):
with open(fileOut1+'.txt', 'r') as fin1:
with open(fileOut2+'.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(fileOut1+'x'+fileOut2+'.txt', 'w') as result_file:
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)
result_file.write('{0} {1} {2}\n'.format(id_, group[0], group[-1]))
def final(self, result_file):
with open(result_file+'.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("old\%06d.jpeg", {}-3, {}+3, 15)\n'.format(fst[1], lst[2]))
fout.write('video1=ImageSource("new\%06d.jpeg", {}-3, {}+3, 15)\n'.format(fst[1], lst[2]))
fout.write('video0=BilinearResize(video0,640,480)\n')
fout.write('video1=BilinearResize(video1,640,480)\n')
fout.write('StackHorizontal(video0,video1)\n')
fout.write('Subtitle("ID: {}", font="arial", size=30, align=8)'.format(k))
load_and_compare()
関数を使用して、 2 つの入力テキスト ファイル、2 つの出力テキスト ファイル、比較結果用のファイル、およびすべての相違点について多くのファイルを書き込む最終フェーズを定義します。
私がやろうとしているのは、このクラス全体を現在の作業ディレクトリで実行し、すべてのサブフォルダーを調べて、2 つのテキスト ファイルを比較し、すべてを同じフォルダー、具体的にはfinal()
結果に書き込むことです。