1

所以我想用三重奏(异步)打开文件,然后由于文件相当大,读取它的单个特定行

所以在“普通”同步python中,我会做这样的事情:

with open("text.txt") as f:
    for i, line in enumerate(f):
        if i == 3:
            print(line)

这将打印文件第二行的内容

现在的问题是,当使用 trio 的 open_file 方法时,enumerate(f)返回错误: TypeError: 'AsyncIOWrapper' object is not iterable

并遵循文档:

async with await trio.open_file("text.txt") as f:
    async for i, line in f:
        print(i)
        print(line)

将只返回 i 的行值,并且只返回行的空格

那么,如何使用 trio/asynchronoulsy 在不丢失大量内存的情况下读取大文件的特定行?

4

1 回答 1

7

构建一个异步枚举函数,如下所示:

async def aenumerate(ait, start=0):
    i = start
    async for item in ait:
        yield i, item
        i += 1

那么您可以轻松地执行以下操作:

async with await trio.open_file("text.txt") as f:
    async for i, line in aenumerate(f):
        print(i)
        print(line)
于 2019-08-11T19:10:30.063 回答