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

Python3 CSV分割程序:读取文件尾后写入循环无法关闭最后文件

嘿,我来帮你搞定这个最后一个文件关不上的问题!

你遇到的这个情况,十有八九是因为处理分割后的文件时,没有正确管理文件句柄——要么是没用到with语句让Python自动帮你关文件,要么是循环结束后忘了手动关闭最后一个打开的文件,导致写入缓存没刷到磁盘,看起来就像没完成写入。

先给你一个更稳妥的写法,用with语句自动管理每个新文件的生命周期,从根源上避免文件漏关的问题:

import csv

def file_splitter(file_name, desired_length):
    with open(file_name, 'r') as original_file:
        # 先读取表头,注意处理换行符
        header = original_file.readline().strip().split(',')
        file_reader = csv.reader(original_file, dialect='excel')
        
        file_counter = 1
        current_batch = []
        
        for row in file_reader:
            current_batch.append(row)
            # 攒够指定行数就写入新文件
            if len(current_batch) == desired_length:
                part_file_name = f"{file_name.split('.')[0]}_part{file_counter}.csv"
                # 用with打开新文件,块结束自动关闭
                with open(part_file_name, 'w', newline='') as part_file:
                    writer = csv.writer(part_file, dialect='excel')
                    writer.writerow(header)
                    writer.writerows(current_batch)
                file_counter += 1
                current_batch = []
        
        # 处理最后一批不足指定行数的内容
        if current_batch:
            part_file_name = f"{file_name.split('.')[0]}_part{file_counter}.csv"
            with open(part_file_name, 'w', newline='') as part_file:
                writer = csv.writer(part_file, dialect='excel')
                writer.writerow(header)
                writer.writerows(current_batch)

# 调用示例,替换成你的文件名和分割行数
file_splitter("your_large_csv.csv", 100)

为什么这个写法能解决问题?

  • 每个分割出来的小文件都用with语句打开,Python会在with代码块执行完毕后自动关闭文件,不管中间有没有出错,都能保证文件句柄被正确释放,写入缓存也会同步到磁盘。
  • 循环结束后单独检查剩余的行,哪怕最后一批只有1行,也会被写入新文件并自动关闭,不会遗漏。

如果你之前的代码是手动用open()打开文件,最后忘了在循环外关闭最后一个文件,那用这个写法直接替换就行,完全不用再操心关闭的问题。

内容的提问来源于stack exchange,提问作者Matt Lefevre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:45