实用脚本能批量遍历吗?

wen 实用脚本 17

本文目录导读:

实用脚本能批量遍历吗?

  1. 遍历文件系统(最常见)
  2. 遍历数据集(CSV、API、数据库)
  3. 实用技巧:提升遍历脚本的健壮性
  4. 总结:实用脚本能否批量遍历?

是的,实用脚本可以批量遍历,这是脚本语言(如 Python、Shell、PowerShell 等)最核心、最强大的功能之一。

“批量遍历”通常指遍历文件系统(文件、文件夹)、遍历数据集合(如数据库、API返回的结果、CSV行)或遍历特定模式(如文件名匹配、内容匹配)。

下面我会分类介绍最常见的几种批量遍历场景及其实用脚本示例。

遍历文件系统(最常见)

这是批量处理文件的基础,如重命名、转换格式、搜索内容等。

Python:遍历所有 .txt 文件并读取前两行

import os
import glob
# 方式一:使用 glob(更简洁,支持通配符)
for filepath in glob.glob('./**/*.txt', recursive=True):
    print(f"处理文件: {filepath}")
    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            # 只读取前两行,适合大型文件
            for _ in range(2):
                line = f.readline()
                if line:
                    print(f"  内容: {line.strip()}")
    except Exception as e:
        print(f"  读取失败: {e}")
# 方式二:使用 os.walk(更底层,可以精确控制目录层级)
for root, dirs, files in os.walk('./data'):
    for file in files:
        if file.endswith('.txt'):
            full_path = os.path.join(root, file)
            print(f"发现文件: {full_path}")

Shell (Bash):批量将 .jpg 转为 .png(使用 ImageMagick)

#!/bin/bash
# 遍历当前目录所有 jpg 文件
for img in *.jpg; do
    # 去除 .jpg 后缀,添加 .png
    filename="${img%.*}"
    echo "转换: $img -> ${filename}.png"
    convert "$img" "${filename}.png"
done

PowerShell:递归获取所有 .log 文件,删除大于100MB的旧文件

# 获取过去30天内、大于100MB的 .log 文件,然后删除
Get-ChildItem -Path "C:\Logs" -Recurse -Filter "*.log" | Where-Object {
    $_.Length -gt 100MB -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)
} | ForEach-Object {
    Write-Host "删除: $($_.FullName) ($($_.Length/1MB) MB)" -ForegroundColor Yellow
    Remove-Item $_.FullName -Force
}

遍历数据集(CSV、API、数据库)

Python:遍历CSV文件的所有行,进行处理并写回

import csv
with open('users.csv', 'r', encoding='utf-8') as infile:
    reader = csv.DictReader(infile) # 按列名访问
    rows = []
    for row in reader:
        # 对每一行进行处理,将名字首字母大写
        row['Name'] = row['Name'].title()
        # 过滤:只保留活跃用户
        if row['Status'] == 'Active':
            rows.append(row)
# 写回新的CSV
with open('users_clean.csv', 'w', encoding='utf-8', newline='') as outfile:
    if rows:
        writer = csv.DictWriter(outfile, fieldnames=rows[0].keys())
        writer.writeheader()
        writer.writerows(rows)

Python:遍历API分页结果(爬虫场景)

import requests
def fetch_all_pages(base_url, params=None):
    if params is None:
        params = {}
    params['page'] = 1
    all_data = []
    while True:
        print(f"获取第 {params['page']} 页...")
        response = requests.get(base_url, params=params)
        data = response.json()
        # 假设返回的数据在 'results' 字段,并有 'next' 指示是否有下一页
        all_data.extend(data.get('results', []))
        if data.get('next'):
            params['page'] += 1
        else:
            break
    return all_data
# 使用示例
# users = fetch_all_pages('https://api.example.com/users')

实用技巧:提升遍历脚本的健壮性

批量操作有风险(如误删文件、重名覆盖),以下技巧非常重要:

技巧 说明 示例代码(Python)
日志记录 记录每一步操作,方便复查 logging.info(f"删除: {path}")
测试模式 print 要执行的操作,不真正执行 if args.dry_run: print(f"将要删除 {path}")
进度条 处理大量文件时提示进度 from tqdm import tqdm
for file in tqdm(files):
异常处理 跳过权限不足、文件损坏等问题 try: ... except PermissionError: pass
限制并发 避免IO打满或API限流 import concurrent.futures 限制线程数

实用脚本能否批量遍历?

绝对可以,而且这是编写实用脚本的核心能力。

  • 对于文件系统:脚本可以递归遍历、按通配符匹配、按属性过滤。
  • 对于数据:脚本可以遍历CSV行、JSON记录、API分页、数据库查询结果。
  • 对于任何可迭代对象:字符串、列表、网络数据流等。

最佳实践是:先在小范围数据上测试(--dry-run 模式),确认无误后再全量执行,配合日志和进度条保证可控性。

如果你有具体的批量需求(批量重命名图片、批量下载网页、批量处理PDF),可以告诉我,我能给出更针对性的脚本示例。

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