如何避免创建Dummy文件获取文件引用?文件分割代码优化咨询
避免创建Dummy文件的优雅文件分割方案
完全懂你的感受——为了初始化文件句柄就创建一个临时dummy文件,用完还要删掉,确实有点冗余又麻烦。我们可以通过延迟初始化输出文件句柄的方式彻底解决这个问题,根本不需要提前创建任何无用文件。
基础改进版本(贴近原代码逻辑)
这个版本保留了你原有的核心逻辑,但去掉了dummy文件的创建:
import os chunk_size = 512 count = 0 i = 0 fw = None # 初始化为None,不提前创建任何文件 # 使用with语句自动管理输入文件,无需手动close with open('some_file.bin', 'rb') as f: chunk = f.read(chunk_size) while chunk: if count == 0: # 如果不是第一次创建文件,先关闭之前的句柄 if fw is not None: fw.close() filename = f'part_{i}.bin' i += 1 fw = open(filename, 'wb') fw.write(chunk) count = (count + 1) % 100 chunk = f.read(chunk_size) # 最后关闭最后一个打开的输出文件 if fw is not None: fw.close()
关键改进点:
- 把
fw初始化为None,只在真正需要写入的时候才创建新的输出文件,彻底避免dummy文件 - 用
with语句处理输入文件f,Python会自动帮你关闭文件,不用手动调用f.close(),更安全也更简洁 - 增加了
if fw is not None的判断,防止原文件为空时调用fw.close()触发报错 - 用f-string(
f'part_{i}.bin')替代字符串拼接,代码可读性更强
更Pythonic的进阶写法
如果想让代码更简洁,还可以借助itertools.islice来批量处理chunk,不用手动维护count变量:
import os from itertools import islice chunk_size = 512 parts_per_file = 100 # 每个文件写入100个chunk # 生成器函数:按指定大小读取文件chunk def chunk_generator(file_obj, chunk_size): while True: chunk = file_obj.read(chunk_size) if not chunk: break yield chunk with open('some_file.bin', 'rb') as f: chunks = chunk_generator(f, chunk_size) part_num = 0 while True: # 一次获取100个chunk作为一批 batch = list(islice(chunks, parts_per_file)) if not batch: break # 没有更多数据,退出循环 part_num += 1 # 用with语句管理输出文件,自动关闭 with open(f'part_{part_num}.bin', 'wb') as fw: for chunk in batch: fw.write(chunk)
这个写法的优势:
- 用生成器封装chunk读取逻辑,代码结构更清晰
- 借助
islice批量获取chunk,不用手动维护计数变量count,减少出错概率 - 所有文件都用
with语句管理,完全不用手动调用close(),代码更安全简洁
内容的提问来源于stack exchange,提问作者Rolf
相关产品推荐
相关产品推荐

