学习Python:StringIO与cStringIO

摘要:
StringIO的行为与文件对象的行为非常相似。当前缓冲区内容为ABCDEF=StringIO('ABCDEF')#从头开始写入,这将覆盖ABC。write('abc')#每次使用read()进行读取时,都必须查找()#定位到开头。seek(0)#查找输出abcDEFprints。read()#定位到第二个字符cs。搜索(2)#从当前位置读取到末尾。

StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。一个简单的例子,让你对StringIO有一个感性的认识:

from StringIO import StringIO  
  
# 生成一个StringIO对象,当前缓冲区内容为ABCDEF    
s = StringIO('ABCDEF')  
# 从开头写入,将会覆盖ABC  
s.write('abc')  
# 每次使用read()读取前,必须seek()  
# 定位到开头  
s.seek(0)  
# 将输出abcDEF  
print s.read()  
# 定位到第二个字符c  
s.seek(2)  
# 从当前位置一直读取到结束,将输出cDEF  
print s.read()  
s.seek(3)  
# 从第三个位置读取两个字符,将输出DE  
print s.read(2)  
s.seek(6)  
# 从指定位置写入  
s.write('GH')  
s.seek(0)  
# 将输出abcDEFGH  
print s.read()  
# 如果读取所有内容,可以直接使用getvalue()  
# 将输出abcDEFGH  
print s.getvalue() 

  通过例子,我们看到了StringIO的行为,基本与file一致。StringIO提供了一个方法,可以方便的获取其中的数据:StringIO. getvalue()。如果使用read方法获取其中的数据,必须通过seek先设置"文件指针"的位置。

Python标准模块中还提供了一个cStringIO模块,它的行为与StringIO基本一致,但运行效率方面比StringIO更好。因此,import的时候会写成下面的方式,但使用 cStringIO模块时,有几个注意点: 

1. cStringIO.StringIO不能作为基类被继承;

2. 创建cStringIO.StringIO对象时,如果初始化函数提供了初始化数据,新生成的对象是只读的。

try:  
    from cStringIO import StringIO  
except ImportError:  
    from StringIO import StringIO  
  
s = StringIO('A')  
s.write('abc')  
# 会提示:AttributeError: 'cStringIO.StringI' object has no attribute 'write'  
print s.getvalue()  

  

免责声明:文章转载自《学习Python:StringIO与cStringIO》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue + ElementUI 的横向表格代码Celery模块使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DELPHI移动端支付宝支付

Delphi XE7 Android 应用接入支付宝SDK的方法     1      应用场景和准备工作: 采用XE系列开发的android apps。 apps中需要集成支付宝的支付能力。 支付到指定的商家(一般就是软件开发商自己啦),商家需要事先在支付宝的开放平台申请开通【支付宝无线快捷支付】,具体请百度。 开通【无线快捷支付】后,支付宝应该返回给...

YII2框架集成go!aop

AOP实践:YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的。下面以YII2框架集成go!aop库为例,介绍在YII2中如何实现AOP编程.(go!aop简介,可以参考go!aop的官网.)由于YII框架拥有自己的类加载器,所在集成go!aop的时候,不能正常的工作,所以要将其禁用掉...

selenium xpath高级语法

# xpath 使用路径表达式来匹配xml文档或html文档中的节点或节点集, # 这个路径表达式,和我们常见的文件夹路径有点像 # xpath 的标准语法 //tagname[@属性=''] # @后边可以跟任意属性,只要这个元素有就可以 # //a[@href='http://t.zoukankan.com/checkwork/manage']/i[...

QT显示如何减轻闪屏(双缓冲和NoErase)

很多同志在些QT 程序后会遇见闪屏的问题, 有时速度非常快,但毕竟影响了显示效果,如何做到减轻屏幕抖动或闪屏呢?我曾试过如下的办法:1.使用双缓冲。 比如我们在一个Widget里面绘多个图的话, 先创建一个QPixmap对象 然后用QPainter在这个QPixmap对象上绘图,最用后BitBlt 将数据copy到active painterDev上就可以...

Delphi 使用CreateProcess创建进程并弹出进程PID值 (转)

var  ExeName:PChar;  StartupInfo:TStartupInfo;  ProcessInfo:TProcessInformation;begin  FillChar(ProcessInfo,sizeof(TProcessInformation),0);  FillChar(StartupInfo,Sizeof(TStartupIn...

Java IO系列之一:IO

1. 概述  Java IO一般包含两个部分:   1.java.io包中堵塞型IO;   2.java.nio包中的非堵塞型IO,通常称为New IO。 java.io包下,分为四大块近80个类: 1、基于字节操作的I/O接口:InputStream和OutputStream 2、基于字符操作的I/O接口:Writer和Reader 3、基于磁盘操作的I...