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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:48:05