使用 Ruby 或 Python 在文件中查找

对于经常使用爬虫的我来说,在大多数文本编辑器都会有"在文件中查找"功能,主要是方便快捷的查找自己说需要的内容,那我有咩有可能用Ruby 或 Python实现类似的查找功能?这些功能又能怎么实现?

问题背景

许多流行的文本编辑器都具有"在文件中查找"功能,该功能可以在一个对话框中打开,其中包含以下选项:

  • 查找: 指定要查找的文本。
  • 文件筛选器: 指定要搜索的文件类型。
  • 开始位置: 指定要开始搜索的目录。
  • 报告: 指定要显示的结果类型,例如文件名、文件计数或两者兼有。
  • 方法: 指定要使用的搜索方法,例如正则表达式或纯文本搜索。

有人希望使用 Python 或 Ruby 类来实现类似的功能,以便可以在任何支持 Python 或 Ruby 的平台上从脚本运行此操作。

解决方案

Python

以下代码提供了在指定目录中搜索特定文本的 Python 脚本示例:

python 复制代码
import os
import re

def find_in_files(search_text, file_filter, start_dir, report_filenames, regex_search):
    results = []
    if regex_search:
        p = re.compile(search_text)
    for dir, subdirs, subfiles in os.walk(start_dir):
        for name in fnmatch.filter(subfiles, file_filter):
            fn = os.path.join(dir, name)
            with open(fn, 'r') as f:
                if regex_search:
                    results += [(fn, lineno) for lineno, line in enumerate(f) if p.search(line)]
                else:
                    results += [(fn, lineno) for lineno, line in enumerate(f) if line.find(search_text) >= 0]
    if report_filenames:
        return [fn for fn, _ in results]
    else:
        return results

search_text = '__searchtext__'
file_filter = '*.txt; *.htm'
start_dir = 'c:/docs/2009'
report_filenames = False
regex_search = False

results = find_in_files(search_text, file_filter, start_dir, report_filenames, regex_search)

for result in results:
    print(result)

Ruby

以下代码提供了在指定目录中搜索特定文本的 Ruby 脚本示例:

ruby 复制代码
require 'find'
require 'rexml/document'

def find_in_files(search_text, file_filter, start_dir, report_filenames, regex_search)
  results = []
  if regex_search
    regex = Regexp.new(search_text)
  end
  Find.find(start_dir) do |path|
    if File.file?(path) && file_filter.match(path)
      file = File.open(path, 'r')
      file.each_line do |line|
        if regex_search
          results << path if line =~ regex
        else
          results << path if line.include?(search_text)
        end
      end
      file.close
    end
  end
  if report_filenames
    return results.uniq
  else
    return results
  end
end

search_text = '__searchtext__'
file_filter = '*.txt; *.htm'
start_dir = 'c:/docs/2009'
report_filenames = false
regex_search = false

results = find_in_files(search_text, file_filter, start_dir, report_filenames, regex_search)

results.each do |result|
  puts result
end

上述脚本可以接受以下参数:

  • searchtext:要查找的文本。
  • file_filter:要搜索的文件类型。
  • start_dir:要开始搜索的目录。
  • report_filenames:指定是只报告文件名还是同时报告文件内容。
  • regex_search:指定是否使用正则表达式进行搜索。

脚本将返回一个包含所有匹配文件的文件名列表,或者如果指定了报告文件名选项,则返回一个包含所有匹配文件的文件名和行号的列表。

上面就是两种语实现在文件中查找的具体代码,其实看着也不算太复杂,只要好好的去琢磨,遇到的问题也都轻而易举的解决,如果在使用中有任何问题,可以留言讨论。

相关推荐
欢乐少年19042 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
IT猿手2 小时前
2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
人工智能·python·算法·数学建模·matlab·智能优化算法
萧鼎3 小时前
深入解析 Umi-OCR:高效的免费开源 OCR 文字识别工具
python·ocr·umi-ocr
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
IT、木易4 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
明矾java4 小时前
MySQL进阶-关联查询优化
数据库·mysql
冰糖码奇朵4 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
迷路的小犀牛4 小时前
【MYSQL数据库异常处理】执行SQL语句报超时异常
数据库·sql·mysql
Mr.NickJJ5 小时前
JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
开发语言·javascript·react.js
浪九天5 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring