尝试使用python从目录中的所有文件中查找特定单词

时间:2016-02-03 15:28:38

标签: python

我在目录中有近200个文件,我正在寻找特定的文件 这200个文件中包含usernamepinschema等字词。 问题是如何改进以下脚本以查找目录中所有文件中的单词。我当前的脚本只能搜索一个文件中的单词并添加行号。 以下是我的剧本:

from os import system, listdir,path
import time
system("cls")
system("color b9")
with open("C:\Users\ilan\Desktop\kobi.txt") as filee:
for line in filee:
    for word in line.split():
        if word.lower() =="user" or word.lower()=="password" or word.lower()=="username" or word.lower()=="pass" or word.lower()=="secret" or word.lower()=="key" or word.lower()=="backdoor" or word.lower()=="ip":
                FILE=open("CodeR.txt","a")
                FILE.write(word + "\n" )
                #count =1
                #FILE.write(str(count)+word + "\n" )
                #count+=1
                FILE.close()

2 个答案:

答案 0 :(得分:1)

在您处理几个语法错误之前,您的脚本将无法正常工作。 以下是使其发挥作用所需要的:

  1. Python专门处理反斜杠字符(" \")(如" \ n")。 如果您想/需要在字符串中使用反斜杠字符,您可以:

    一个。 "逃"每个反斜杠字符加倍,如:

       with open("C:\\Users\\ilan\Desktop\\kobi.txt") as filee:
    

    这告诉Python你真的想要一个反斜杠字符。

    OR

    B中。把你的字符串变成"原始字符串"在它之前加上' r',如:

       with open(r"C:\Users\ilan\Desktop\kobi.txt") as filee:
    
  2. 缩进整个" for file in filee"块。

  3. 这会将您的代码转换为:

    from os import system, listdir,path
    import time
    system("cls")
    system("color b9")
    with open("C:\\Users\\ilan\Desktop\\kobi.txt") as filee:
        for line in filee:
            for word in line.split():
                if word.lower() =="user" or word.lower()=="password" or word.lower()=="username" or word.lower()=="pass" or word.lower()=="secret" or word.lower()=="key" or word.lower()=="backdoor" or word.lower()=="ip":
                        FILE=open("CodeR.txt","a")
                        FILE.write(word + "\n" )
                        #count =1
                        #FILE.write(str(count)+word + "\n" )
                        #count+=1
                        FILE.close()
    

    可以通过以下方式简化:

    1. 删除:

      import time
      

      因为不需要它。

    2. 此外,正如furas建议的那样,您可以通过使用以下方式消除使用lower()这么多次的需要:

      word = word.lower()

    3. 然而,我建议改为将您读入的整行转换为小写。

      这会将您的代码转换为:

      from os import system, listdir,path
      system("cls")
      system("color b9")
      with open("C:\\Users\\ilan\Desktop\\kobi.txt") as filee:
          for line in filee:
              for word in line.lower().split():
                  if word =="user" or word=="password" or word=="username" or word=="pass" or word=="secret" or word=="key" or word=="backdoor" or word=="ip":
                          FILE=open("CodeR.txt","a")
                          FILE.write(word + "\n" )
                          #count =1
                          #FILE.write(str(count)+word + "\n" )
                          #count+=1
                          FILE.close()
      

      然后,然后更改该代码,使其适用于“桌面”中的所有文件。如你所知,你可以使用' os.listdir' 与其他一些清理一起执行此操作(在任何缩进块之外移动您的FILE.open()和FILE.close()并将所有单词放入'设置'您可以检查其成员身份in)给出:

      from os import system, listdir,path
      system("cls")
      system("color b9")
      FILE=open("CodeR.txt","a")
      for fn in listdir("C:\\Users\\ilan\Desktop"):
          with open("C:\\Users\\ilan\Desktop\\" + fn) as filee:
              for line in filee:
                  for word in line.lower().split():
                      if word in {"user", "password", "username", "pass", "secret", "key", "backdoor", "ip"}:
                              FILE.write(word + "\n" )
                              #count =1
                              #FILE.write(str(count)+word + "\n" )
                              #count+=1
      FILE.close()
      

      (否则,您可以重复打开和关闭FILE。)

      最后,如果你的桌面'目录包含任何文件夹,您可以使用os.path.isfile()函数将它们排除在正常文件中(并使脚本崩溃)。 并且您可以使用os.path.join()将路径的各个部分与文件名组合在一起(让os添加任何所需的向前或向后斜杠)。 这个,以及间距等的一些变化,更多"标准" (根据PEP8样式指南所期望的),给出:

      from os import system, listdir, path
      system("cls")
      system("color b9")
      FILE = open("CodeR.txt", "a")
      desktop_dir = r"C:\Users\ilan\Desktop"
      for fn in listdir(desktop_dir):
          fn_w_path = path.join(desktop_dir, fn)
          if path.isfile(fn_w_path):
              with open(fn_w_path) as filee:
                  for line in filee:
                      for word in line.lower().split():
                          if word in {"user", "password", "username", "pass",
                                      "secret", "key", "backdoor", "ip"}:
                              FILE.write(word + "\n")
      FILE.close()
      

答案 1 :(得分:0)

使用os.walk遍历目录树中的所有文件。 使用正则表达式(re模块)来搜索文本中的单词。

import os
import re

words = ['password', 'user', 'ip', 'key']
rx = re.compile('|'.join(words))

for root, dirs, files in os.walk('C:\\Users\\ilan\Desktop'):
    for filename in files:
        with open(filename) as df:
            data = df.read()
        for match in rx.finditer(data):
            # Use the MatchObject as you like
            print match.span()