异步文件操作。
aiofile的Python项目详细描述
真正的异步文件操作与异步支持。
状态
发展-稳定
功能
代码示例
所有代码示例都需要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()