Python按行数拆分CSV保留表头及输出到子目录问题求助
CSV拆分脚本问题修复方案
问题1:子文件无法保留原表头
原因
循环读取CSV时,当skiprows参数大于0,pandas会将跳过行后读取到的第一行(原CSV的数据行)识别为表头,导致子文件表头错误。
解决方法
先单独读取原CSV的表头存储,非首次读取数据时指定header=None,再手动给DataFrame赋值原表头。
问题2:仅拆分第一个文件就终止
原因
创建输出目录的代码放在了循环内部,第一次循环成功创建目录后,第二次循环再次执行os.mkdir时会因目录已存在抛出FileExistsError,直接终止程序。
解决方法
将目录创建逻辑移到循环外,使用os.makedirs并添加exist_ok=True参数,避免重复创建目录报错。
完整修正代码
import os import time import pandas as pd # 配置参数 in_csv = 'D:path\\test.csv' rowsize = 100 parent_dir = 'path\\rows' directory = 'output' # 提前创建输出目录(移到循环外) path = os.path.join(parent_dir, directory) os.makedirs(path, exist_ok=True) print('输出目录初始化完成\n') # 先读取原CSV表头 original_header = pd.read_csv(in_csv, nrows=0).columns.tolist() # 统计总数据行数(扣除表头行) number_lines = sum(1 for row in open(in_csv, encoding='utf-8')) - 1 # 循环拆分 for i in range(0, number_lines, rowsize): # 非首次读取时跳过表头+已读行,不自动识别表头 if i == 0: df = pd.read_csv(in_csv, nrows=rowsize) else: df = pd.read_csv(in_csv, nrows=rowsize, skiprows=i+1, # +1是跳过原表头行 header=None) df.columns = original_header out_csv = os.path.join(path, f'NewFile_{i//rowsize + 1}.csv') print(f'正在生成文件:{out_csv}') df.to_csv(out_csv, index=False, header=True, encoding='utf-8') time.sleep(2)
额外优化说明
- 文件名改为按序号命名(NewFile_1.csv、NewFile_2.csv...),比按跳过行数命名可读性更高
- 新增编码指定,避免中文乱码问题
- 移除了不必要的
mode='a'和chunksize参数,单次写入无需追加模式
内容的提问来源于stack exchange,提问作者babyboydaprince
相关产品推荐
相关产品推荐

