4

まず、web と stackoverflow で約 3 日間検索しましたが、探しているものが見つかりませんでした。

私は毎週のセキュリティ監査を行っており、IP と開いているポートを含む .csv ファイルを取得しています。それらは次のようになります。

20160929.csv

10.4.0.23;22
10.12.7.8;23
10.18.3.192;23

20161006.csv

10.4.0.23;22
10.18.3.192;23
10.24.0.2;22
10.75.1.0;23

違いは、 10.12.7.8 :23が閉じられたことです。 10.24.0.2:2210.75.1.0:23が開かれました。

私を出力するスクリプトが欲しい:

[-] 10.12.7.8:23
[+] 10.24.0.2:22
[+] 10.75.1.0:23

このようなスクリプトを作成するにはどうすればよいですか? 私は自分のdifflibを試しましたが、それは私が必要としているものではありません. 後でそれをファイルに書き込むか、その出力を既にスクリプトを持っているメールとして送信できるようにする必要があります。

うちの会社はWindows環境で他のOSが使えないので、Unixは使えません。diffそのため、他の優れたツールを使用することはできません。

これは私の最初の試みです:

old = set((line.strip() for line in open('1.txt', 'r+')))
new = open('2.txt', 'r+')
diff = open('diff.txt', 'w')

for line in new:
    if line.strip() not in old:
        diff.write(line)
new.close()
diff.close()

これは私の2回目の試みです

old = set((line.strip() for line in open('1.txt', 'r+')))
new = open('2.txt', 'r+')
diff = open('diff.txt', 'w')

for line in new:
    if line.strip() not in old:
        diff.write(line)
new.close()
diff.close()
4

3 に答える 3

3

次のソリューションでは、セットを使用しているため、順序は関係ありません。古いものと新しいものを直接減算して、何が変更されたかを確認できます。

withまた、ファイルを開くためのコンテキスト マネージャー パターンも使用しました。

def read_items(filename):
    with open(filename) as fh:
        return {line.strip() for line in fh}

def diff_string(old, new):
    return "\n".join(
        ['[-] %s' % gone for gone in old - new] +
        ['[+] %s' % added for added in new - old]
    )

with open('diff.txt', 'w') as fh:
    fh.write(diff_string(read_items('1.txt'), read_items('2.txt')))

明らかに、必要に応じて差分文字列を出力できます。

于 2016-10-06T10:14:50.363 に答える
1

コードをベースとして使用すると、次のことができます。

old = set((line.strip() for line in open('1.txt')))
new = set((line.strip() for line in open('2.txt')))

with open('diff.txt', 'w') as diff:
    for line in new:
        if line not in old:
            diff.write('[-] {}\n'.format(line))

    for line in old:
        if line not in new:
            diff.write('[+] {}\n'.format(line))

ここにはいくつかの調整があります。

  1. 古いファイルと新しいファイルの両方の個々の行を読み取って比較したいと考えています。
  2. stripファイルの読み取り中に行ったので、個々の行にする必要はありません。
  3. と を使用{}.format()てテキスト文字列を作成します。
  4. を使用\nすると、出力ファイルの新しい行に各エントリが配置されます。
  5. with書き込み先のファイルに を使用すると、呼び出さなくてもファイルを開くことができclose、(私の知識が正しければ) ファイルを開いた後にプログラムがクラッシュした場合の処理​​が改善されます。
于 2016-10-06T10:12:17.703 に答える
0

これを試すことができます:

old_f = open('1.txt')
new_f = open('2.txt')
diff = open('diff.txt', 'w')

old = [line.strip() for line in old_f]
new = [line.strip() for line in new_f]

for line in old:
    if line not in new:
        print '[-] ' + str(line)
        diff.write('[-] ' + str(line) + '\n'


for line in new:
    if line not in old:
        print '[+]' + str(line)
        diff.write('[+] ' + str(line) + '\n'

old_f.close()
new_f.close()
diff.close()
于 2016-10-06T10:12:46.027 に答える