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
相关产品推荐
相关产品推荐

