如何使用Python实现带重叠行的CSV文件拆分
带重叠行的CSV拆分实现
你的需求本质是滑动窗口分块:每个块固定大小,下一个块的起始位置和上一个块末尾保留指定行数的重叠。按照你给出的示例,块大小为4000行,相邻块重叠1000行,每次滑动步长为3000行。
原有代码的问题在于每次写完一个块就直接清空所有缓存行,没有保留需要重叠的部分,且循环写法有误。以下是可直接运行的改进代码:
# 可按需调整的配置项 chunk_size = 4000 # 每个拆分文件的数据行数(不含表头) overlap_size = 1000 # 相邻文件的重叠行数,匹配示例规则 step = chunk_size - overlap_size # 分块滑动步长 def write_chunk(part_num, lines, header): with open(f'data_part_{part_num}.csv', 'w', encoding='utf-8') as f_out: f_out.write(header) f_out.writelines(lines) with open("8-0new2.csv", "r", encoding='utf-8') as f: header = f.readline() all_data_lines = f.readlines() total_rows = len(all_data_lines) part = 1 start_idx = 0 while start_idx < total_rows: end_idx = min(start_idx + chunk_size, total_rows) # 截取当前块的行 current_chunk_lines = all_data_lines[start_idx:end_idx] write_chunk(part, current_chunk_lines, header) # 滑动到下一个块的起始位置 start_idx += step part += 1
逻辑说明
- 按照示例规则验证:第1个文件取前4000条数据,第2个文件从第3001条数据开始取4000条,和第一个文件末尾1000条数据重叠,第3个文件从第6001条数据开始取,以此类推,完全匹配重叠要求。如果需要严格对齐你提到的3000行起始位置,只要把
overlap_size调整为1001即可。 - 最后不足4000行的剩余数据会自动写入最后一个拆分文件,不会丢失。
- 如果源文件编码不是utf-8,把代码里的
encoding参数改成对应编码即可,比如gbk、utf-8-sig。 - 如果你的CSV文件过大(超过内存容量),可以把一次性读所有行的逻辑改成维护一个固定长度的缓存队列,逐行读入滑动输出即可;常规大小的CSV用上述写法逻辑最简单,出错概率低。
内容的提问来源于stack exchange,提问作者Treemore
相关产品推荐
相关产品推荐

