如何优化Python中UTF-8转UTF-8-BOM的CSV转换代码以降低内存占用?
优化UTF-8 CSV转UTF-8-BOM的Python代码(低内存版本)
你的原代码通过一次性读取整个文件内容实现转换,处理大体积CSV文件时会占用大量内存,甚至引发内存不足问题。以下是两种低内存占用的优化方案:
方案一:逐行读取写入(适合需文本处理的场景)
这种方式每次仅在内存中保留一行数据,内存消耗几乎不受文件大小影响:
def convert_csv_to_utf8_bom(input_file_path, output_file_path, logger: Logger): """ 将UTF-8编码的CSV文件转换为UTF-8-BOM编码,低内存占用版本 """ logger.debug("convert csv to utf8 bom") # 同时打开输入输出文件,逐行处理 with open(input_file_path, "r", encoding="utf-8") as infile, \ open(output_file_path, "w", encoding="utf-8-sig") as outfile: for line in infile: outfile.write(line)
方案二:按块高效复制(适合纯编码转换场景)
利用shutil.copyfileobj进行块级复制,结合手动添加UTF-8 BOM,效率更高:
import shutil def convert_csv_to_utf8_bom(input_file_path, output_file_path, logger: Logger): """ 将UTF-8编码的CSV文件转换为UTF-8-BOM编码,高效低内存版本 """ logger.debug("convert csv to utf8 bom") with open(input_file_path, "rb") as infile, \ open(output_file_path, "wb") as outfile: # 写入UTF-8 BOM头(\xef\xbb\xbf) outfile.write(b'\xef\xbb\xbf') # 按块复制文件内容,默认块大小为16KB,可通过length参数调整(如length=1024*1024表示1MB块) shutil.copyfileobj(infile, outfile)
方案对比
- 方案一:灵活性强,若后续需要对CSV每行内容做额外处理(如数据清洗),可直接在循环中扩展逻辑。
- 方案二:性能更优,底层调用系统级IO操作,适合仅需添加BOM的纯编码转换场景。
两种方案均避免了一次性加载整个文件到内存,能轻松处理GB级别的大CSV文件,同时完美适配希伯来语的编码需求。
内容的提问来源于stack exchange,提问作者idan ovadia
相关产品推荐
相关产品推荐

