You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动