Python异步写入CSV遇问题:writerows无await致无内容写入求解决
解决异步写入CSV时writerows无输出的问题
这个问题我之前也碰到过!核心原因是Python标准库的csv.DictWriter是同步工具,和aiofiles的异步文件对象不兼容——同步writer调用的是文件对象的同步write方法,但aiofiles返回的文件对象只有异步的write方法(需要await),这就导致writer的操作没有真正执行,自然不会写入任何内容。
下面给你三个可行的解决方案,你可以根据自己的场景选择:
方案一:用同步文件操作(简单可靠,适合小数据量)
如果写CSV的操作不是程序的性能瓶颈(比如数据量不大),直接用标准的同步文件操作反而更简单,完全避开异步和同步工具的兼容性问题:
import csv import os def write_extract_file(output_filename: str, csv_list: list): """ Write the extracted content into the file """ try: # 加上newline=''避免Windows系统下生成多余空行 with open(output_filename, "w+", newline='') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=columns.keys()) writer.writeheader() writer.writerows(csv_list) except FileNotFoundError: print("Output file not present", output_filename) print("Current dir: ", os.getcwd()) raise
方案二:使用异步CSV库(适合全异步架构)
如果你的程序是全异步设计,不想因为同步操作阻塞事件循环,可以使用专门的异步CSV库aiocsv,它和aiofiles完美兼容:
首先安装依赖:
pip install aiocsv
然后修改你的异步写入函数:
import os import aiofiles from aiocsv import AsyncDictWriter async def write_extract_file(output_filename: str, csv_list: list): """ Write the extracted content into the file """ try: async with aiofiles.open(output_filename, "w+", newline='') as csv_file: writer = AsyncDictWriter(csv_file, fieldnames=columns.keys()) await writer.writeheader() # 异步方法需要加await await writer.writerows(csv_list) # 异步方法需要加await except FileNotFoundError: print("Output file not present", output_filename) print("Current dir: ", os.getcwd()) raise
方案三:内存中生成CSV再异步写入(无额外依赖)
如果不想安装第三方库,也可以先在内存里用同步的csv模块生成完整的CSV内容,再一次性异步写入文件:
import csv import os import aiofiles from io import StringIO async def write_extract_file(output_filename: str, csv_list: list): """ Write the extracted content into the file """ try: # 先在内存中用同步CSV工具生成所有内容 output_buffer = StringIO() writer = csv.DictWriter(output_buffer, fieldnames=columns.keys()) writer.writeheader() writer.writerows(csv_list) # 把内存中的内容异步写入文件 async with aiofiles.open(output_filename, "w+") as csv_file: await csv_file.write(output_buffer.getvalue()) except FileNotFoundError: print("Output file not present", output_filename) print("Current dir: ", os.getcwd()) raise
内容的提问来源于stack exchange,提问作者Soumendra




