首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python异步编写CSV文件

用Python异步编写CSV文件
EN

Stack Overflow用户
提问于 2020-08-09 08:50:10
回答 3查看 6.3K关注 0票数 7

我正在编写一个具有以下功能的CSV文件:

代码语言:javascript
运行
复制
import csv
import os
import aiofiles


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+") 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 FileNotFoundError

但是,由于在writerows方法上不允许等待,所以没有将行写入CSV文件。

如何解决这一问题?有什么解决办法吗?

谢谢。

整个代码都可以找到这里

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-09 19:32:50

在我看来,最好不要尝试将aiofilescsv模块一起使用,并使用loop.run_in_executor运行同步代码,然后异步等待,如下所示:

代码语言:javascript
运行
复制
def write_extract_file(output_filename: str, csv_list: list):
    """
    Write the extracted content into the file
    """
    try:
        with open(output_filename, "w+") 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 FileNotFoundError


async def main():
    loop = asyncio.get_running_loop()
    await loop.run_in_executor(None, write_extract_file, 'test.csv', csv_list)
票数 6
EN

Stack Overflow用户

发布于 2021-12-09 10:18:47

您可以使用艾奥切夫。下面是异步将行写入CSV文件的一个快速示例:

代码语言:javascript
运行
复制
import asyncio
import aiofiles
from aiocsv import AsyncWriter

async def main():
    async with aiofiles.open('your-path.csv', 'w') as f:
        writer = AsyncWriter(f)
        await writer.writerow(['name', 'age'])
        await writer.writerow(['John', 25])

asyncio.run(main())

有关更多示例,请参见:https://pypi.org/project/aiocsv/

票数 7
EN

Stack Overflow用户

发布于 2020-08-13 14:07:34

您可以使用aiofiles,您只需将数据转换为一行:)

代码语言:javascript
运行
复制
import aiofiles

async def write_extract_file(
    output_filename: str, csv_list: list
):

    cols = columns.keys()

    async with aiofiles.open(output_filename, mode='w+') as f_out:

        await f_out.write(','.join(cols)+'\n')

        for data in csv_list:

            line = []

            for c in cols:
                line.append(str(data[c]) if c in data else '')

            line = ','.join(line) + '\n'
    
            await f_out.write(line)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63324327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档