我怎么能用三重奏异步读取文件的特定行

Lia*_*iam 1 python asynchronous python-3.x python-trio

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

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

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

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

现在的问题是,当使用 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)
Run Code Online (Sandbox Code Playgroud)

只会为 i 返回该行的值,而对于该行只返回空格

那么,如何使用三重奏/异步来读取大文件的特定行而不会丢失太多内存?

Lia*_*iam 7

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

async def aenumerate(ait, start=0):
    i = start
    async for item in ait:
        yield i, item
        i += 1
Run Code Online (Sandbox Code Playgroud)

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

async with await trio.open_file("text.txt") as f:
    async for i, line in aenumerate(f):
        print(i)
        print(line)
Run Code Online (Sandbox Code Playgroud)