我想从没有Web服务器的本地主机获取文件异步。似乎可以使用file://方案。以下代码示例摘自文档,但显然不起作用:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'file://localhost/Users/user/test.txt')
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
如何使其工作?
我看到的一种方法是使用run_in_executor在单独的线程池中使用“ curl file:// path”,但我认为应该有一种方法来修复代码
答案 0 :(得分:2)
如果需要获取本地文件的内容,则可以使用普通的Python内置插件来实现,例如:
with open('Users/user/test.txt') as rd:
html = rd.read()
如果文件不是很大,并且存储在本地文件系统中,则您甚至不需要使其异步,因为读取文件的速度将足够快而不会干扰事件循环。如果文件很大或由于其他原因读取速度可能很慢,则应通过run_in_executor
进行读取,以防止其阻塞其他异步代码。例如(未试用):
def read_file_sync(file_name):
with open('Users/user/test.txt') as rd:
return rd.read()
async def read_file(file_name):
loop = asyncio.get_event_loop()
html = await loop.run_in_executor(None, read_file_sync, file_name)
return html