2014-08-28 65 views
0

我有了幾行文本文件,讓說:如何檢查,看看是否在內容文件存在於目錄中的文件中的內容

cat 
dog 
rabbit 

我想遍歷目錄來檢查是否有任何文本文件包含上述列表中的項目。

我嘗試了許多不同的方法。我不想發佈任何內容,因爲我想要一個新的開始......思路清晰。我對下面的代碼進行了處理,以至於我甚至不知道發生了什麼,並且我完全失去了意義。 :(

#! /usr/bin/python 

''' 
The purpose of this program 
is to search the OS file system 
in order to find a txt file that contain the nagios host entries 
''' 

import os 

host_list = open('/path/path/list', 'r') 

host = host_list.read() 
##for host in host_remove.read(): 

host_list.close() 
#print host 

for root, dirs, files in os.walk("/path/path/somefolder/"): 
    for file in files: 
     if file.endswith(".txt"): 

      check_file = os.path.join(root, file) 
      #print check_file 


      if host.find(check_file): #in check_file: 

       print host.find(check_file)      
       #print host+" is found in "+check_file 
       #print os.path.join(root, file) 
      else: 
       break 
+2

你的問題的第二部分完全是題外話。我刪除它。 – MattDMo 2014-08-28 17:52:34

+0

您可以分享您迄今爲止的嘗試嗎? – dano 2014-08-28 18:46:41

+0

第二個問題是公平的嗎?但任何誰 – user3655020 2014-08-28 18:51:20

回答

2

the shell command的模擬:

$ find /path/somefolder/ -name \*.txt -type f -exec grep -wFf /path/list {} + 

在Python中:

#!/usr/bin/env python 
import os 
import re 
import sys 

def files_with_matched_lines(topdir, matched): 
    for root, dirs, files in os.walk(topdir, topdown=True): 
     dirs[:] = [d for d in dirs if not d.startswith('.')] # skip "hidden" dirs 
     for filename in files: 
      if filename.endswith(".txt"): 
       path = os.path.join(root, filename) 
       try: 
        with open(path) as file: 
         for line in file: 
          if matched(line): 
           yield path 
           break 
       except EnvironmentError as e: 
        print >>sys.stderr, e 

with open('/path/list') as file: 
    hosts = file.read().splitlines() 
matched = re.compile(r"\b(?:%s)\b" % "|".join(map(re.escape, hosts))).search 
for path in files_with_matched_lines("/path/somefolder/", matched): 
    print path 
+0

J.F. Sebastian,當我從一個特定的目錄搜索時,你的代碼工作的很好。但是,如果我在根級搜索,您的程序將不可避免地嘗試打開它無權訪問的文件。我們如何爲此創建一個例外? for files_with_matched_lines(「/」,matched): 文件「/Users/dmartin/scripts/python/host_removal/naghstlctv3.py」,第11行,位於files_with_matched_lines ,開放(路徑)爲文件: IOError:[ Errno 13] Permission denied:'/private/etc/racoon/psk.txt' – user3655020 2014-08-31 03:48:02

+0

我忘了添加。你的代碼完全pythonic,因爲它在unix和windows上運行。我只是試了一下。我只需稍作修改就可以在打開文件的兩個地方接受原始字符串(r)。唯一需要做的就是添加一個異常,以便在程序無法訪問該文件時嘗試搜索。 – user3655020 2014-08-31 04:18:54

+0

@ user3655020:我已經更新了代碼,以便在讀取文件 – jfs 2014-08-31 07:36:14

2

Python是方式,方法矯枉過正這個任務只需使用grep:。

$ grep -wFf list_of_needles.txt some_target.txt 

如果你確實需要使用Python,裹grep呼叫subprocess或類似

+0

好吧,我很感激它可能會殺死。我其實有bash腳本,可以滿足我在peaces中需要的功能。我選擇使用python。主要是爲了幫助學習這門語言。我討厭從書本上練習。我發現必要性是發明之母。當我編碼實際需要的東西時,我傾向於學習得很好。我本來可以在python中使用OS命令,但我想成爲pythonic .....這實際上給我帶來了另一個問題,我希望它不是脫離主題....看到這是python的過度殺手..你認爲python用於什麼? – user3655020 2014-08-28 19:10:31

+0

'find/path/path/somefolder/-name \ * .txt -exec grep -xFf hosts/path/path/list {} +' – jfs 2014-08-28 19:11:17

+0

是的,這就是它在bash中完成的一種方式....怎麼做我在沒有使用bash的情況下在python中執行它? – user3655020 2014-08-28 19:16:50

0

我對J.F. Sebastian提供的algorytms做了一些小的修改。 更改將要求用戶輸入。它也將運行在沒有問題的窗口上。

#!/usr/bin/env python 
import os 
import re 
import sys 

contents = raw_input("Please provide the full path and file name that contains the items you would like to search for \n") 
print "\n" 
print "\n" 
direct = raw_input("Please provide the directory you would like to search. \ 
Use C:/, if you want to search the root directory on a windows machine\n") 

def files_with_matched_lines(topdir, matched): 
    for root, dirs, files in os.walk(topdir, topdown=True): 
     dirs[:] = [d for d in dirs if not d.startswith('.')] # skip "hidden" dirs 
     for filename in files: 
      if filename.endswith(".txt"): 
       path = os.path.join(root, filename) 
       try: 
        with open(path) as file: 
         for line in file: 
          if matched(line): 
           yield path 
           break 
       except EnvironmentError as e: 
        print >>sys.stderr, e 

with open(contents) as file: 
    hosts = file.read().splitlines() 
matched = re.compile(r"\b(?:%s)\b" % "|".join(map(re.escape, hosts))).search 
for path in files_with_matched_lines(direct, matched): 
    print path