2016-04-27 18 views
0

このスクリプトは現在、ファイルから特定のタイプのIPアドレスを取得し、csvにフォーマットします。このPython 2.7スクリプトを同じディレクトリ内の複数のファイルに実行する方法

これを変更して、ディレクトリ内のすべてのファイル(スクリプトと同じディレクトリ)を調べ、新しい出力ファイルを作成するにはどうすればよいですか。これは私の最初の1週間ですので、できるだけシンプルにしてください。

#!usr/bin/python 

    # Extract IP address from file 

    #import modules 
    import re 

    # Open Source File 
    infile = open('stix1.xml', 'r') 
    # Open output file 
    outfile = open('ExtractedIPs.csv', 'w') 
    # Create a list 
    BadIPs = [] 

    #search each line in doc 
    for line in infile: 
     # ignore empty lines 
     if line.isspace(): continue 

     # find IP that are Indicator Titles 
     IP = (re.findall(r"(?:<indicator:Title>IP:) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", line)) 
     # Only take finds 
     if not IP: continue 
     # Add each found IP to the BadIP list 
     BadIPs.append(IP) 

    #tidy up for CSV format 
    data = str(BadIPs) 
    data = data.replace('[', '') 
    data = data.replace(']', '') 
    data = data.replace("'", "") 
    # Write IPs to a file   
    outfile.write(data) 

    infile.close 
    outfile.close 

答えて

1

は、このスクリプトになり、同じファイルにすべての出力を追加したいと仮定:

#!usr/bin/python 
import glob 
import re 

for infileName in glob.glob("*.xml"): 
    # Open Source File 
    infile = open(infileName, 'r') 
    # Append to file 
    outfile = open('ExtractedIPs.csv', 'a') 
    # Create a list 
    BadIPs = [] 

    #search each line in doc 
    for line in infile: 
     # ignore empty lines 
     if line.isspace(): continue 

     # find IP that are Indicator Titles 
     IP = (re.findall(r"(?:<indicator:Title>IP:) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", line)) 
     # Only take finds 
     if not IP: continue 
     # Add each found IP to the BadIP list 
     BadIPs.append(IP) 

    #tidy up for CSV format 
    data = str(BadIPs) 
    data = data.replace('[', '') 
    data = data.replace(']', '') 
    data = data.replace("'", "") 
    # Write IPs to a file   
    outfile.write(data) 

    infile.close 
    outfile.close 
+0

素晴らしい、ありがとう – DnkApollo

0
  1. import sys
  2. examle def extract(filename)のために、あなたの現在のコードのうち、機能を確認します。
  3. すべてのファイル名でスクリプトを呼び出します。python myscript.py file1 file2 file3
  4. スクリプト内で、ファイル名for filename in sys.argv[1:]:をループします。
  5. ループ内の関数:extract(filename)を呼び出します。
+0

これは良いと思いますが、問題は何千もの小さなファイルになります – DnkApollo

+0

シェルはこれを行うことができます: 'python myscript.py filepattern *'。 –

2

私はあなたがglob.globを見てしたいと考えて:https://docs.python.org/2/library/glob.html

これは、与えられたパターンにマッチするファイルのリストを返します。

あなたは、 輸入再ような何かをあなたがこのようなすべてのXMLファイルのリストを得ることができ

def do_something_with(f): 
    # Open Source File 
    infile = open(f, 'r') 
    # Open output file 
    outfile = open('ExtractedIPs.csv', 'wa') ## ADDED a to append 
    # Create a list 
    BadIPs = [] 

    ### rest of you code 
    . 
    . 
    outfile.write(data) 

    infile.close 
    outfile.close 

for f in glob.glob("*.xml"): 
    do_something_with(f) 
+0

私はこれをどこに追加しますか?あなたの例では、infile = open(f)に入りますか? – DnkApollo

+0

@DnkApollo - あなたは現在書いているすべてのものをこれで囲みたいと思うでしょう。次に、 'infile = open( 'stix1.xml'、 'r')'の代わりに 'infile = open(f、 'r')'を使用します。あなたの 'outfile'行は' glob'ループの外側になければなりません - それは一度だけ開いて、すべてのxmlのすべてがそれに追加されます(複数のcsvファイルが生成されない限り)。 – ArtOfWarfare

1

をグロブすることができます。

filenames = [nm for nm in os.listdir() if nm.endswith('.xml')] 

次に、すべてのファイルを繰り返します。

for fn in filenames: 
    with open(fn) as infile: 
     for ln in infile: 
      # do your thing 

with -statementは、あなたがそれで終わった後にファイルが閉じていることを確認します。

+0

'glob'は' listdir' 、私は思う...確かにそれはより簡潔に終わる。しかし、とにかく+1。 – ArtOfWarfare

0

私はこれを行う必要があった、とも同様にサブディレクトリに行くことに。あなたは、このような関数を使用することができ、OSとはos.pathをインポートする必要があります。

def recursive_glob(rootdir='.', suffix=()): 
    """ recursively traverses full path from route, returns 
     paths and file names for files with suffix in tuple """ 
    pathlist = [] 
    filelist = [] 
    for looproot,dirnames, filenames in os.walk(rootdir): 
     for filename in filenames: 
      if filename.endswith(suffix): 
       pathlist.append(os.path.join(looproot, filename)) 
       filelist.append(filename) 
    return pathlist, filelist 

あなたが探しているファイルの種類のファンクションにあなたがから開始するトップレベルのディレクトリとサフィックスを渡します。これはWindows用に書かれ、テストされましたが、私はあなたが仕事をするファイル拡張子を持っている限り、他のOSでも同様に動作すると信じています。

0

現在のフォルダ内のすべてのファイルが適切な場合は、os.listdir()を使用できます。そうでない場合は、.xmlのファイルをすべて指定し、glob.glob("*.xml")を使用します。しかし、全体的なプログラムは、おおよそ次のように改善することができます。

#import modules 
import re 

pat = re.compile(reg) # reg is your regex 
with open("out.csv", "w") as fw: 
    writer = csv.writer(fw) 
    for f in os.listdir(): # or glob.glob("*.xml") 
     with open(f) as fr: 
      lines = (line for line in fr if line.isspace()) 
      # genex for all ip in that file 
      ips = (ip for line in lines for ip in pat.findall(line)) 
      writer.writerow(ips) 

おそらく正確なニーズに合わせて変更する必要があります。しかし、このバージョンでは、副作用が少なく、メモリ消費量が少なく、closeがコンテキストマネージャによって管理されています。動作しない場合はご意見ください。

関連する問題