Python批量删除CSV文件表头并替换分隔符为|的代码运行异常问题
原代码失效的核心原因
- 同路径文件同时开启读写双模式是最大bug:当你在同一个上下文里同时对同一个文件用'r'读模式和'w'写模式打开时,'w'模式触发的瞬间就会把原文件内容全部截断清空,此时读流拿到的已经是空文件,后续的跳表头、替换分隔符操作根本没有可处理的内容。这种写法运行时通常会直接抛出StopIteration错误,就算没触发报错,写回去的内容也是空的,完全达不到处理效果。
- 路径拼接逻辑不严谨:直接字符串拼接路径,Windows/macOS/Linux的路径分隔符不统一会导致找不到文件;也没有过滤目录下的子文件夹,遍历到目录对象时会触发读取报错。
- 未指定文件编码,跨环境运行时容易出现中文乱码。
可直接实现需求的修正代码
代码逻辑调整为「先读入全部内存内容、完成处理后再写回文件」,彻底规避同时读写导致的文件清空问题,同时补上路径兼容、文件类型过滤的逻辑:
import os def remove_header_replace_delimiter(): # 替换为实际存放CSV文件的文件夹路径 src_folder = r'你的CSV文件夹绝对路径' for file_name in os.listdir(src_folder): # 拼接跨平台兼容的完整文件路径 full_file_path = os.path.join(src_folder, file_name) # 跳过子目录、非CSV格式的文件,避免报错 if not os.path.isfile(full_file_path) or not file_name.lower().endswith('.csv'): continue # 第一步:读入原文件全部内容到内存 with open(full_file_path, 'r', encoding='utf-8') as f: file_lines = f.readlines() # 第二步:处理内容——跳过第一行表头,剩余行把逗号替换为| processed_content = [] # 切片取所有非表头行(跳过索引0的第一行) for line in file_lines[1:]: processed_content.append(line.replace(',', '|')) # 第三步:将处理后的内容写回原文件 with open(full_file_path, 'w', encoding='utf-8') as f: f.writelines(processed_content) print(f'文件 {file_name} 处理完成') if __name__ == '__main__': remove_header_replace_delimiter()
实用提醒
- 运行脚本前务必备份原始CSV文件,脚本默认直接覆盖原文件,避免处理逻辑不符合预期造成数据丢失。
- 如果你的CSV字段存在双引号包裹的内嵌逗号内容(比如员工姓名、备注字段里本身带逗号),全局字符串替换逗号的方式会把字段内部的逗号也替换成竖线,这种场景需要使用Python内置的
csv模块做结构化解析后再导出,不能直接做字符串替换。 - 若需要处理的单文件体积超过500MB,全量读入内存的方式会占用过高系统资源,可以改用临时文件方案:逐行读取原文件、把处理后的内容先写到同目录的临时文件里,全部处理完成后再用临时文件替换原文件,兼顾内存占用和读写安全。
内容的提问来源于stack exchange,提问作者user15227198
相关产品推荐
相关产品推荐

