雁过请留痕...
代码改变世界

python 查找文件内容

2015-03-11 16:45  xiashengwang  阅读(4808)  评论(0编辑  收藏  举报

输入查找的文件夹路径,要查找的内容关键字(可以指定多个),要查找的文件类型(可以是多个),搜索出符合条件的文件,并记录所有符合条件的行号及行内容。

写的感觉有点冗余,但好歹还能使用^-^,主要是方便手头工作。

# coding:utf8
import os
from os.path import *

# enter the search dir
print r"""Search file tool(Ver1.0)
dirpath /k keywords [/e fileextension] [/o resultfilepath]
/k  keyword you want to search
/e  file extension(.txt .java .cs etc...)
/o  the path of the result file you want to save
example:
e:\temp\py /k 'kw1' /e '.txt'
e:\temp\py /k "kw1" "kw2" /e ".txt" ".cs" /o e:\temp\py\result.txt
"""

# Get user command.
input = raw_input("> ")
if input.find("/k") < 0:
    print "/k option must  be input"
    exit(1)

# Get the dir    
root_dir = input.split("/k")[0].strip()
if not isdir(root_dir):
    print "First parameter must be a valid dir!"
    exit(1)

# Get the keywords and file extension    
option = input.split("/k")[1].strip()
if option.find("/e") < 0:
    key_words = [s.strip("\'\"") for s in option.split()]
else:    
    key_words = [s.strip("\'\"") for s in option.split("/e")[0].strip().split()]
    if option.find("/o") < 0:
        file_exts = [s.strip("\'\"") for s in option.split("/e")[1].strip().split()]
    else:
        file_exts = [s.strip("\'\"") for s in option.split("/e")[1].strip().split("/o")[0].strip().split()]    

search_filter = "Search dir:%s\n" % root_dir
search_filter = search_filter + ("Search key words:%s\n" % " ".join(key_words))
if file_exts:
    search_filter = search_filter + ("Search file type:%s\n" % " ".join(file_exts))
print search_filter

# Search file by the keyword
result_files = {}
for (dir_name, subdirs, files) in os.walk(root_dir):
    for file in files:
        filepath = os.path.join(dir_name, file) 
        ext = os.path.splitext(filepath)[1]
        if file_exts and (ext not in file_exts):
            continue

        file = open(filepath)
        # Compare every lines of the file by the keywords
        for index, line in enumerate(file.readlines()):
            for keyword in key_words:
                if line.find(keyword) > 0:
                    # Save matched line and line number
                    match_line = "line:%d %s" % (index, line)
                    if filepath not in result_files.keys():
                        result_files[filepath] = []    
                    result_files[filepath].append(match_line) 
                    break
        file.close()
print "Search finish!"

# Output the search result
if option.find("/o") >= 0:
    # Write result to file
    save_file_path = option.split("/o")[len(option.split("/o")) - 1].strip()
    save_file = open(save_file_path, "w")     
    save_file.write(search_filter)
    summary = "find:%d files" % len(result_files.keys())                   
    save_file.write("%s\n" % summary)
    for key, value in result_files.items():
        save_file.write("%s\n" % key)
        for line in value:
            #print "type:", type(line)
            save_file.write("--%s" % line)  
    save_file.close()  
else:
    # Show result in command window 
    summary = "find:%d files" % len(result_files.keys())                   
    print summary
    for key, value in result_files.items():
        print "%s" % key
        for line in value:
            print "--%s" % line    
              
                    
直接运行,就可以提示你如何操作,第一个实用的python程序,记录一下。