2017-05-11 46 views
2

我有3個文件夾供我使用,我需要逐個比較文件夾1和文件夾2中的文件,然後逐個將結果寫入文件夾3中的文件。現在我有這樣的腳本:Python - 在多個文件比較後,將結果寫入多個文件

import os 
import difflib 
import sys 
path1 = "D:\folder1" 
path2 = "D:\folder2" 
path3 = "D:\folder3" 
dirs1 = os.listdir(path1) 
dirs2 = os.listdir(path2) 
dirs3 = os.listdir(path3) 
for file_name in dirs1: 
    file_1_path = os.path.join(path1, file_name) 
    name,ext = os.path.splitext(file_name) 
    file_2_path = os.path.join(path2, name+str(1)+ext) 
    file_3_path = os.path.join(path3, name+str('-Result')+ext) 
    with open (file_1_path) as xmlfile1: 
    with open (file_2_path) as xmlfile2: 
     line_num1=sum(1 for line1 in xmlfile1) 
     line_num2=sum(1 for line2 in xmlfile2) 
     xmlfile1.seek(0) 
     xmlfile2.seek(0) 
     diffInstance = difflib.Differ() 
     diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 
     with open (file_3_path) as result: 
     for i,line in enumerate(diffList): 
      result.write(line) 
      if line_num1 == line_num2: 
      if line.startswith('+'): 
       sys.stdout.write('Current version Line: {} , text: {}'.format(i-1,line)) 
      elif line.startswith('-'): 
       sys.stdout.write('Previous version Line: {}, text: {}'.format(i+1,line)) 
      if line_num1 > line_num2: 
      x = line_num1-line_num2 
      if line.startswith('-'): 
       sys.stdout.write('Missed Line: {} from previous version, text: {}'.format(i+1,line)) 
      if line_num1<line_num2: 
      y = line_num2-line_num1 
      if line.startswith('+'): 
       sys.stdout.write('Extra Line: {} in currect version, text: {}'.format(i+1,line)) 

,但似乎效果不好,我得到的錯誤是這樣的:

Traceback (most recent call last): 
File "C:/comparison.py", line 25, in <module> 
     result.write(line) 
    io.UnsupportedOperation: not writable 
+0

您是否有權寫入第三個目錄?你可以在那裏創建一個文件,看看你是否真的可以寫嗎? – Colwin

+0

是的,我這樣做,如果我只是比較兩個文件與自己的路徑輸入,我可以正確地得到結果,現在我只是改變我的腳本,使其更自動,沒有輸入自己的文件路徑 – Emily

回答

1

使用open只有一個參數假定r模式,並且使用with open (file_3_path) as result:。當然,在讀取模式下使用文件對象write將不起作用。改爲with open (file_3_path, 'w') as result:,文件將是可寫的。在上下文中:

import os 
import difflib 
import sys 
path1 = "D:\folder1" 
path2 = "D:\folder2" 
path3 = "D:\folder3" 
dirs1 = os.listdir(path1) 
dirs2 = os.listdir(path2) 
dirs3 = os.listdir(path3) 
for file_name in dirs1: 
    file_1_path = os.path.join(path1, file_name) 
    name,ext = os.path.splitext(file_name) 
    file_2_path = os.path.join(path2, name+str(1)+ext) 
    file_3_path = os.path.join(path3, name+str('-Result')+ext) 
    with open (file_1_path) as xmlfile1: 
    with open (file_2_path) as xmlfile2: 
     line_num1=sum(1 for line1 in xmlfile1) 
     line_num2=sum(1 for line2 in xmlfile2) 
     xmlfile1.seek(0) 
     xmlfile2.seek(0) 
     diffInstance = difflib.Differ() 
     diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 
     with open (file_3_path, 'w') as result: 
     for i,line in enumerate(diffList): 
      result.write(line) 
      if line_num1 == line_num2: 
      if line.startswith('+'): 
       sys.stdout.write('Current version Line: {} , text: {}'.format(i-1,line)) 
      elif line.startswith('-'): 
       sys.stdout.write('Previous version Line: {}, text: {}'.format(i+1,line)) 
      if line_num1 > line_num2: 
      x = line_num1-line_num2 
      if line.startswith('-'): 
       sys.stdout.write('Missed Line: {} from previous version, text: {}'.format(i+1,line)) 
      if line_num1<line_num2: 
      y = line_num2-line_num1 
      if line.startswith('+'): 
       sys.stdout.write('Extra Line: {} in currect version, text: {}'.format(i+1,line)) 
+0

大聲笑,非常感謝! – Emily

相關問題