Python StringIO模块实现在内存缓冲区中读写数据


Posted in Python onApril 08, 2015

模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中。
此类中的大部分函数都与对文件的操作方法类似。

例:

#coding=gbk

 

import StringIO, cStringIO, sys

 

s = StringIO.StringIO("JGood is a handsome boy")

s.write("JGood is a handsome boy \r\n")

s.write('okkkk中国')

s.seek(0)

print s.read()

 

#最后4个字节

s.seek(-4, 2)

print s.read()

 

#---- 结果 ----

#JGood is a handsome boy 

#okkkk中国

#中国

 

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

Python标准模块中还提供了一个cStringIO模块,它的行为与StringIO基本一致,但运行效率方面比StringIO更好。但使用 cStringIO模块时,有几个注意点: 1. cStringIO.StringIO不能作为基类被继承;2. 创建cStringIO.StringIO对象时,如果初始化函数提供了初始化数据,新生成的对象是只读的。所以下面的代码是错误的:s = cStringIO.StringIO("JGood/n"); s.write("OOOKKK");

----------------------

s=StringIO.StrngIO([buf])

此实例类似于open方法,不同的是它并不会在硬盘中生成文件,而只寄存在缓冲区;可选参数buf是一个str或unicode类型。它将会与其他后续写入的数据存放在一起。
----------------------
StringIO类中的方法:
● read
● readline
● readlines
● write
● writelines
● getvalue
● truncate
● tell
● seek
● close
● isatty
● flush
----------------------
s.read([n])
参数n限定读取长度,int类型;缺省状态为从当前读写位置读取对象s中存储的所有数据。读取结束后,读写位置被移动。
----------------------
s.readline([length])
参数length限定读取的结束位置,int类型,缺省状态为None:从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
----------------------
s.readlines([sizehint])
参数sizehint为int类型,缺省状态为读取所有行并作为列表返回,除此之外从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
----------------------
s.write(s)
从读写位置将参数s写入给对象s。参数s为str或unicode类型。读写位置被移动。
----------------------
s.writelines(list)
从读写位置将list写入给对象s。参数list为一个列表,列表的成员为str或unicode类型。读写位置被移动。
----------------------
s.getvalue()
此函数没有参数,返回对象s中的所有数据。
----------------------
s.truncate([size])
从读写位置起切断数据,参数size限定裁剪长度,缺省值为None。
----------------------
s.tell()
返回当前读写位置。
----------------------
s.seek(pos[,mode])
移动当前读写位置至pos处,可选参数mode为0时将读写位置移动至pos处,为1时将读写位置从当前位置起向后移动pos个长度,为2时将读写位置置于末尾处再向后移动pos个长度;默认为0。
----------------------
s.close()
释放缓冲区,执行此函数后,数据将被释放,也不可再进行操作。
---------------------
s.isatty()
此函数总是返回0。不论StringIO对象是否已被close()。
----------------------
s.flush()
刷新内部缓冲区。
----------------------
dir(StringIO.StringIO)的返回值中还包含有一个test函数,不过不用理睬它,它没有任何意义

=====================================================

StringIO经常被用来作为字符串的缓存,应为StringIO有个好处,他的有些接口和文件操作是一致的,也就是说用同样的代码,可以同时当成文件操作或者StringIO操作。比如:

import string, os, sys

import StringIO
def writedata(fd, msg):

    fd.write(msg)

    

f = open('aaa.txt', 'w')
writedata(f, "xxxxxxxxxxxx")

f.close()
s = StringIO.StringIO()

writedata(s, "xxxxxxxxxxxxxx")

因为文件对象和StringIO大部分的方法都是一样的,比如read, readline, readlines, write, writelines都是有的,这样,StringIO就可以非常方便的作为"内存文件对象"。

  import string

import StringIO
s = StringIO.StringIO()

s.write("aaaa")

lines = ['xxxxx', 'bbbbbbb']

s.writelines(lines)
s.seek(0)

print s.read()
print s.getvalue()

s.write(" ttttttttt ")

s.seek(0)

print s.readlines()

print s.len

StringIO还有一个对应的c语言版的实现,它有更好的性能,但是稍有一点点的区别,cStringIO没有len和pos属性。(还有,cStringIO不支持Unicode编码)
Python 相关文章推荐
python处理xml文件的方法小结
May 02 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
Python装饰器用法实例总结
Feb 07 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Python中如何添加自定义模块
Jun 09 Python
django rest framework 过滤时间操作
Jul 12 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 Python
Python实现的简单文件传输服务器和客户端
Apr 08 #Python
操作Windows注册表的简单的Python程序制作教程
Apr 07 #Python
编写简单的Python程序来判断文本的语种
Apr 07 #Python
Python实现在线程里运行scrapy的方法
Apr 07 #Python
Python实现从脚本里运行scrapy的方法
Apr 07 #Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 #Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
You might like
解决GD中文乱码问题
2007/02/14 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
php生成二维码
2015/08/10 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
Js基础学习资料
2010/11/23 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
Python中有几个关键字
2020/06/04 Python
亲子读书活动方案
2014/02/22 职场文书
工业设计专业自荐书
2014/06/05 职场文书
英语系本科生求职信
2014/07/15 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
2016年教师新年寄语
2015/08/18 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript