异步文件操作。

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无法使用JAXB配置Moxy   java如何让我的简单Swing telnet客户端正确显示字符?   java中从可运行线程调用主线程的多线程处理   java数据源。EBJ3会话bean中的getConnection()   使用java和正则表达式从xml文件提取值时出现问题   java定制Jersy胡须Mvc   在Java中,“限制并发”是什么意思?   java有没有更干净的方法可以在这里使用Optional,而不在三个地方返回“NA”?   java Tomcat启动,然后崩溃,除非我打电话   java理解客户机和服务器   java时间戳将在视图对象>实体转换期间丢失   如何在java中返回布尔值(基元)?   java使用spring mvc设置日志记录,希望仅对我的代码进行跟踪/调试   用Jackson解析嵌套对象