异步文件操作。

aiofile的Python项目详细描述


Drone CILatest Versionhttps://img.shields.io/pypi/wheel/aiofile.svghttps://img.shields.io/pypi/pyversions/aiofile.svghttps://img.shields.io/pypi/l/aiofile.svg

真正的异步文件操作与异步支持。

状态

发展-稳定

功能

  • aiofile没有内部指针。您应该为每个操作传递offsetchunk_size,或者使用帮助程序(读写器)。
  • 对于posix(macos x和linux),使用基于aio.h(带Cython)的实现。
  • 对于使用基于线程实现的非posix系统

代码示例

所有代码示例都需要Python3.5+。

读写

importasynciofromaiofileimportAIOFileasyncdefmain():asyncwithAIOFile("/tmp/hello.txt",'w+')asafp:awaitafp.write("Hello ")awaitafp.write("world",offset=7)awaitafp.fsync()print(awaitafp.read())loop=asyncio.get_event_loop()loop.run_until_complete(main())

与助手一起读写

importasynciofromaiofileimportAIOFile,Reader,Writerasyncdefmain():asyncwithAIOFile("/tmp/hello.txt",'w+')asafp:writer=Writer(afp)reader=Reader(afp,chunk_size=8)awaitwriter("Hello")awaitwriter(" ")awaitwriter("World")awaitafp.fsync()asyncforchunkinreader:print(chunk)loop=asyncio.get_event_loop()loop.run_until_complete(main())

逐行读取文件

importasynciofromaiofileimportAIOFile,LineReader,Writerasyncdefmain():asyncwithAIOFile("/tmp/hello.txt",'w+')asafp:writer=Writer(afp)awaitwriter("Hello")awaitwriter(" ")awaitwriter("World")awaitwriter("\n")awaitwriter("\n")awaitwriter("From async world")awaitafp.fsync()asyncforlineinLineReader(afp):print(line)loop=asyncio.get_event_loop()loop.run_until_complete(main())

unix管道的读写

importosimportasynciofromaiofileimportAIOFile,Reader,Writerasyncdefreader(fname):print('Start reader')asyncwithAIOFile(fname,'a')asafp:whileTrue:# Maximum expected chunk size, must be passed.# Otherwise will be read zero bytes# (because unix pipe has zero size)data=awaitafp.read(4096)print(data)asyncdefwriter(fname):print('Start writer')asyncwithAIOFile(fname,'w')asafp:whileTrue:awaitasyncio.sleep(1)awaitafp.write('%06f'%loop.time())asyncdefmain():fifo_name="/tmp/test.fifo"ifos.path.exists(fifo_name):os.remove(fifo_name)os.mkfifo(fifo_name)# Starting two readers and one writer, but only one reader# will be reading at the same time.awaitasyncio.gather(reader(fifo_name),reader(fifo_name),writer(fifo_name),)loop=asyncio.new_event_loop()asyncio.set_event_loop(loop)try:loop.run_until_complete(main())finally:# Shutting down and closing file descriptors after interruptloop.run_until_complete(loop.shutdown_asyncgens())loop.close()print('Exited')

逐行读取文件

importasynciofromaiofileimportAIOFile,LineReader,Writerasyncdefmain():asyncwithAIOFile("/tmp/hello.txt",'w')asafp:writer=Writer(afp)foriinrange(10):awaitwriter("%d Hello World\n"%i)awaitwriter("Tail-less string")asyncwithAIOFile("/tmp/hello.txt",'r')asafp:asyncforlineinLineReader(afp):print(line[:-1])loop=asyncio.get_event_loop()loop.run_until_complete(main())

异步csv dict reader

importasyncioimportiofromcsvimportDictReaderfromaiofileimportAIOFile,LineReaderclassAsyncDictReader:def__init__(self,afp,**kwargs):self.buffer=io.BytesIO()self.file_reader=LineReader(afp,line_sep=kwargs.pop('line_sep','\n'),chunk_size=kwargs.pop('chunk_size',4096),offset=kwargs.pop('offset',0),)self.reader=DictReader(io.TextIOWrapper(self.buffer,encoding=kwargs.pop('encoding','utf-8'),errors=kwargs.pop('errors','replace'),),**kwargs,)self.line_num=0def__aiter__(self):returnselfasyncdef__anext__(self):ifself.line_num==0:header=awaitself.file_reader.readline()self.buffer.write(header)line=awaitself.file_reader.readline()ifnotline:raiseStopAsyncIterationself.buffer.write(line)self.buffer.seek(0)try:result=next(self.reader)exceptStopIterationase:raiseStopAsyncIterationfromeself.buffer.seek(0)self.buffer.truncate(0)self.line_num=self.reader.line_numreturnresultasyncdefmain():asyncwithAIOFile('sample.csv','rb')asafp:asyncforiteminAsyncDictReader(afp,line_sep='\r'):print(item)loop=asyncio.new_event_loop()asyncio.set_event_loop(loop)try:loop.run_until_complete(main())finally:# Shutting down and closing file descriptors after interruptloop.run_until_complete(loop.shutdown_asyncgens())loop.close()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用从PreparedStatement返回的RowId。getGeneratedKeys()?   selenium chrome驱动程序中下一个网站url的java空白页   java如何将参数化匿名类转换为lambda?   java JUnit在AfterClass上获取测试结果   java将动态XML/JSON内容与静态标记化负载进行比较,并检索标记值   java共享一个需要数据持久性的项目[数据库]   java在调用方法时获取意外的参数类型。getParameterTypes()   java如何用jdbc在swing中用另一个字段替换外键?   需要java Jersey Tomcat CDI依赖项解释   java如何生成UML图   java如何编写Jersey rest服务可以通过给定的spring代码访问   SpringMaven存储库管理器Nexus与Java依赖项的Artifactory   java将包从另一个项目导入eclipse中的当前项目   加密Java使用密码加密文件