如何使用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
相关产品推荐
相关产品推荐

