本文目录导读:

是的,实用脚本可以批量遍历,这是脚本语言(如 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),可以告诉我,我能给出更针对性的脚本示例。