实用脚本能批量查找吗?

wen 实用脚本 9

本文目录导读:

实用脚本能批量查找吗?

  1. 批量查找文件内容(最常见需求)
  2. 批量查找文件名
  3. 批量查找 Excel/CSV 文件中的数据
  4. 批量查找数据库中的记录(如 MySQL, SQLite)
  5. 高级实用脚本:综合批量查找工具(Python 封装)

是的,实用脚本可以非常高效地实现批量查找,脚本的优势就在于自动化处理重复性任务,批量查找正是其典型应用场景。

下面我为你介绍几种常见场景下的批量查找脚本思路和实用示例,涵盖文件内容、文件名、Excel表格、数据库等。

批量查找文件内容(最常见需求)

场景: 在一个文件夹(含子文件夹)的所有文本文件(如 .txt, .log, .py)中,查找包含关键词“error”或“密码”的所有行。

使用 Python 脚本 (推荐,跨平台):

import os
def search_in_files(folder_path, keywords, extensions=None):
    """
    在文件夹中批量查找包含关键词的文件
    :param folder_path: 要搜索的文件夹路径
    :param keywords: 关键词列表,如 ["error", "password"]
    :param extensions: 文件扩展名列表,如 [".txt", ".log"],None表示所有文件
    """
    results = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_path = os.path.join(root, file)
            # 检查扩展名
            if extensions and not any(file.endswith(ext) for ext in extensions):
                continue
            try:
                with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
                    for line_num, line in enumerate(f, 1):
                        for keyword in keywords:
                            if keyword.lower() in line.lower():
                                results.append({
                                    'file': file_path,
                                    'line': line_num,
                                    'keyword': keyword,
                                    'content': line.strip()
                                })
                                break  # 避免重复记录同一行多个关键词
            except Exception as e:
                print(f"跳过文件 {file_path}: {e}")
    return results
# 使用示例
folder = r"C:\Users\YourName\Documents\logs"
keywords = ["error", "exception"]
found = search_in_files(folder, keywords, [".txt", ".log"])
for item in found:
    print(f"文件: {item['file']} | 行 {item['line']}: {item['content']}")

使用 Shell 命令 (Linux/Mac 下极快):

# 在 /var/log 目录及其子目录下,递归搜索所有 .log 文件中包含 "ERROR" 的行
grep -r "ERROR" /var/log/*.log
# 忽略大小写,显示行号
grep -rni "error" /path/to/your/folder
# 查找包含多个关键词之一的行 (相当于或)
grep -rE "error|warn|fail" /path/to/folder

批量查找文件名

场景: 在一个复杂的文件夹结构中找到所有文件名包含“2024”或“report”的文件。

Python 脚本 (灵活,可定制):

import os
def find_files_by_name(folder_path, keywords):
    found_files = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            for keyword in keywords:
                if keyword in file:  # 文件名包含关键词
                    found_files.append(os.path.join(root, file))
                    break  # 同一个文件只记录一次
    return found_files
files = find_files_by_name(r"C:\Users\YourName\Documents", ["2024", "report"])
for f in files:
    print(f)

使用 Shell 命令 (Linux/Mac):

# 查找当前目录及子目录下所有以 .txt 结尾的文件 (find 本身是查找文件)
find . -name "*.txt"
# 查找文件名包含 "2024" 的文件
find . -name "*2024*"
# 查找文件名以 "report" 开头或包含 "summary" 的文件 (使用 -name 或 -iname 忽略大小写)
find . -iname "*report*" -o -iname "*summary*"

批量查找 Excel/CSV 文件中的数据

场景: 多个 Excel 表格(.xlsx)中,查找某列(如“姓名”)包含特定值的行。

使用 Python (推荐 pandas 库):

import pandas as pd
import os
def search_in_excel(folder_path, search_value, column_name=None):
    found = []
    for file in os.listdir(folder_path):
        if file.endswith(('.xlsx', '.xls')):
            file_path = os.path.join(folder_path, file)
            try:
                df = pd.read_excel(file_path)
                if column_name:
                    # 在某列中查找包含该值的行 (忽略大小写)
                    mask = df[column_name].astype(str).str.contains(search_value, case=False, na=False)
                else:
                    # 在所有列中查找
                    mask = df.apply(lambda row: row.astype(str).str.contains(search_value, case=False, na=False).any(), axis=1)
                rows_found = df[mask]
                if not rows_found.empty:
                    found.append({'file': file, 'rows': rows_found})
            except Exception as e:
                print(f"读取文件 {file} 失败: {e}")
    return found
# 查找“张三”在“姓名”列或所有列中出现的位置
results = search_in_excel(r"C:\Users\YourName\Documents\excels", "张三", "姓名")
for r in results:
    print(f"找到于文件: {r['file']}")
    print(r['rows'])

批量查找数据库中的记录(如 MySQL, SQLite)

场景: 多个数据库(或同一个数据库的多张表)中查找包含某个关键词的记录。

Python 脚本:

import sqlite3
import os
def search_in_sqlite_db(db_path, search_term, tables=None):
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    # 获取所有表名
    if not tables:
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        tables = [row[0] for row in cursor.fetchall()]
    results = []
    for table in tables:
        # 获取该表的所有列
        cursor.execute(f"PRAGMA table_info({table})")
        columns = [row[1] for row in cursor.fetchall()]
        # 构造 WHERE 子句:在每一列中搜索
        conditions = [f"CAST({col} AS TEXT) LIKE '%{search_term}%'" for col in columns]
        where_clause = " OR ".join(conditions)
        sql = f"SELECT * FROM {table} WHERE {where_clause}"
        try:
            cursor.execute(sql)
            rows = cursor.fetchall()
            if rows:
                results.append({'table': table, 'columns': columns, 'rows': rows})
        except Exception as e:
            print(f"查询表 {table} 失败: {e}")
    conn.close()
    return results
# 在 example.db 的所有表中搜索 "admin"
db_path = r"C:\Users\YourName\data.db"
matches = search_in_sqlite_db(db_path, "admin")
for m in matches:
    print(f"表: {m['table']}, 找到 {len(m['rows'])} 条记录")

高级实用脚本:综合批量查找工具(Python 封装)

你可以将上述功能封装成一个命令行工具,方便重复使用:

# batch_finder.py
import argparse, os, sys
def main():
    parser = argparse.ArgumentParser(description="批量查找工具")
    parser.add_argument("path", help="要搜索的文件夹或文件路径")
    parser.add_argument("keyword", help="要查找的关键词")
    parser.add_argument("--type", choices=['file', 'content', 'excel'], default='content',
                        help="查找类型: file(文件名), content(文件内容), excel(Excel内容)")
    parser.add_argument("--ext", nargs='+', default=['.txt','.log'],
                        help="文件扩展名,如 .txt .csv (默认: .txt .log)")
    parser.add_argument("--recursive", action='store_true', help="是否递归子目录")
    args = parser.parse_args()
    if args.type == 'content':
        # 调用上文 search_in_files 函数
        pass
    elif args.type == 'file':
        # 调用上文 find_files_by_name 函数
        pass
    elif args.type == 'excel':
        # 调用上文 search_in_excel 函数
        pass
if __name__ == "__main__":
    main()
查找类型 推荐方案 优势
Python 脚本 / Shell grep 速度快,支持正则,跨平台
文件名 os.walkfind 简单高效,适合目录遍历
Excel/CSV 数据 Python + pandas 灵活处理表格,支持列筛选
数据库 Python + SQL 精准搜索,支持复杂条件
综合工具 自建 CLI 脚本 一劳永逸,方便团队使用

学习建议: 如果只是偶尔用,可以试试 Shell 命令(Linux/Mac)PowerShell(Windows);如果需要复杂逻辑、跨平台、定制化输出,Python 是最佳选择。

抱歉,评论功能暂时关闭!