2017-01-27 1 views
2

同じホスト名を持つ2つのファイルを比較する方法が必要です。私は、ホスト名を解析してリストに保存する関数を書いています。私はそれを持っていると、私はファイルを比較することができる必要があります。一度ホスト名を持つファイルを比較する

各ファイルは別のディレクトリにあります。

ステップ1:各ファイルから「ホスト名」を取得します。 ステップ2:2つのディレクトリから同じ "ホスト名"を持つファイルに対して比較を実行します。

def hostname_parse(directory): 
    results = [] 
    try: 
     for filename in os.listdir(directory): 
      if filename.endswith(('.cfg', '.startup', '.confg')): 
       file_name = os.path.join(directory, filename) 
       with open(file_name, "r") as in_file: 
        for line in in_file: 
         match = re.search('hostname\s(\S+)', line) 
         if match: 
          results.append(match.group(1)) 
          #print "Match Found" 
     return results 
    except IOError as (errno, strerror): 
     print "I/O error({0}): {1}".format(errno, strerror) 
     print "Error in hostname_parse function" 

サンプルデータ:

テストファイル:ホスト名が19-30である。この場合

19-30# 
! 
version 12.3 
service timestamps debug datetime msec 
service timestamps log datetime msec 
service password-encryption 
! 
hostname 19-30 
! 
boot-start-marker 
boot-end-marker 
! 
ntp clock-period 17179738 
ntp source Loopback0 
! 
end 

19-30# 

は、ホスト名のコードを取得します。テストを簡単にするために、私は同じファイルを使用しましたが、同じファイルに変更しました。

上記のとおりです。ホスト名を抽出できますが、見つかったホスト名に基づいてファイルを比較する方法を探しています。

これはファイルの比較です。しかし、特定のフィールドを見ることができることは、私が達成したいことです。初心者のために、私はファイルが同一であることを見ているだけです。大文字と小文字の区別は、シスコが生成した同じ書式のファイルであるため、重要ではありません。ファイルの内容は、私が "設定"の変更を探しているほど重要です。

+0

あなたが比較しようとしていることについて具体的に説明する必要があります。ファイルが同じかどうかを調べていますか?大文字と小文字の区別/順序や内容について気にしますか?あなたが比較する必要がある特定のフィールドはありますか?これは非常に広い質問です。 – flyingmeatball

答えて

1

要件を満たすためのコードは次のとおりです。私はテストする方法がなかったので、いくつかの問題があるかもしれません。変更を見つける方法として、ファイルコンテンツのハッシュを計算するためにハッシュライブラリを使用しています。

import hashlib 
import os 
import re 

HOSTNAME_RE = re.compile(r'hostname +(\S+)') 

def get_file_info_from_lines(filename, file_lines): 
    hostname = None 
    a_hash = hashlib.sha1() 
    for line in file_lines: 
     a_hash.update(line.encode('utf-8')) 
     match = HOSTNAME_RE.match(line) 
     if match: 
      hostname = match.group(1) 
    return hostname, filename, a_hash.hexdigest() 

def get_file_info(filename): 
    if filename.endswith(('.cfg', '.startup', '.confg')): 
     with open(filename, "r") as in_file: 
      return get_file_info_from_lines(filename, in_file.readlines()) 

def hostname_parse(directory): 
    results = {} 
    for filename in os.listdir(directory): 
     info = get_file_info(filename) 
     if info is not None: 
      results[info[0]] = info 
    return results 

results1 = hostname_parse('dir1') 
results2 = hostname_parse('dir2') 

for hostname, filename, filehash in results1.values(): 
    if hostname in results2: 
     _, filename2, filehash2 = results2[hostname] 
     if filehash != filehash2: 
      print("%s has a change (%s, %s)" % (
       hostname, filehash, filehash2)) 
      print(filename) 
      print(filename2) 
      print() 
+0

ありがとうございます@Stephen Rauchこれは私が探しているものを正確に見えます。私はfilename = os.path.join(directory、filename)を追加しなければならなかった。なぜなら、ファイルが見つからないというエラーが出ていたからだ。しかし、今私はAttributeErrorを取得しています: 'NoneType'オブジェクトに33行目に属性 'values'がありません。 – NineTail

+0

@NineTail不明な戻り値を追加しました。 –

+0

はい、今すぐご覧いただきありがとうございます。 – NineTail

関連する問題