You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python批量处理文件夹内所有CSV生成新文件,支持命令行调用并修复代码运行异常

现有可正常运行的单文件过滤代码

该代码的逻辑是读取单份CSV,提取包含指定日期的行到列表和新文件中:

with open('path' , 'r')as f:
    for lines in f:
        if '2020-12-31' in lines:
            line_data = lines.split(';') 
            filtered_list.append(line_data)
            newfile.write(lines)
待实现需求
  • 将上述单文件过滤逻辑扩展,批量处理指定文件夹下的所有CSV文件
  • 脚本支持命令行运行,使用sys模块实现参数传递,无需修改代码内写死的路径
已编写但运行异常的代码
import os 
from os import walk
from pathlib import Path

dir = r'myPathFolder1' 
target = r'myPathFolder2'
 
filtered_list=[]
for filenames in os.listdir(dir):
    for f in filenames:
        if f.endswith(".csv"):
            newfile = open(dir + f, 'w')
            with open(f , 'r') as t:
                for lines in t:
                    if '2020-12-31' in lines:
                        line_data = lines.split(';') 
                        filtered_list.append(line_data)
                    newfile.write(lines)
代码异常根因
  • 循环逻辑错误:os.listdir(目标文件夹) 返回的是该目录下所有文件/子文件夹名称组成的字符串列表,不需要对单个文件名再做字符级遍历,原代码嵌套for f in filenames相当于遍历文件名的每个字符,完全无法匹配到CSV文件
  • 路径拼接错误:直接用字符串拼接文件夹路径和文件名,缺少路径分隔符,会生成无效的文件路径
  • 文件读写逻辑错误:在读取源文件前就以w写权限模式打开对应路径的文件,会直接清空原文件内容,导致无内容可读
  • 过滤逻辑偏差:代码中无论行内容是否包含匹配关键词,都会将行写入新文件,和最初的“仅保留匹配行”的过滤目标不一致
  • 编码未指定:读写文件时未声明编码,遇到包含中文的CSV会出现乱码、读取失败的问题
修正后可直接运行的完整代码
import os
import sys

def main():
    # 校验命令行参数数量
    if len(sys.argv) != 4:
        print("使用格式:python filter_csv.py <源文件夹路径> <目标结果文件夹路径> <匹配关键词>")
        sys.exit(1)

    # 从命令行读取参数
    source_dir = sys.argv[1]
    target_dir = sys.argv[2]
    match_keyword = sys.argv[3]
    filtered_records = []

    # 自动创建结果文件夹,不存在则生成
    os.makedirs(target_dir, exist_ok=True)

    # 遍历源文件夹下所有文件
    for filename in os.listdir(source_dir):
        # 仅处理后缀为.csv的文件
        if not filename.endswith(".csv"):
            continue

        # 拼接完整文件路径,避免字符串拼接的路径错误
        source_file = os.path.join(source_dir, filename)
        target_file = os.path.join(target_dir, f"filtered_{filename}")

        # 同时打开源文件和结果文件,完成读写过滤
        with open(source_file, 'r', encoding='utf-8') as f_in, open(target_file, 'w', encoding='utf-8') as f_out:
            for line in f_in:
                if match_keyword in line:
                    row_data = line.strip().split(';')
                    filtered_records.append(row_data)
                    f_out.write(line)

    # 可选:将所有匹配到的行汇总为单个总文件
    with open(os.path.join(target_dir, "all_matched_records.csv"), 'w', encoding='utf-8') as f_total:
        for row in filtered_records:
            f_total.write(';'.join(row) + '\n')

if __name__ == "__main__":
    main()
运行方式
  • 命令行执行示例:python filter_csv.py "D:/原始CSV存放路径" "D:/过滤结果存放路径" "2020-12-31"
  • 脚本不会修改、覆盖源文件夹内的原始CSV文件
  • 结果文件夹内会生成每个CSV对应的过滤后单独文件,以及所有匹配行的汇总文件

内容的提问来源于stack exchange,提问作者Domec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 20:06:01