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 相关文章推荐
机器学习经典算法-logistic回归代码详解
Dec 22 Python
python:print格式化输出到文件的实例
May 14 Python
关于Python作用域自学总结
Jun 10 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Python3.9新特性详解
Oct 10 Python
如何利用python读取micaps文件详解
Oct 18 Python
基于Django集成CAS实现流程详解
Nov 28 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
Python 统计序列中元素的出现频度
Apr 26 Python
详解OpenCV曝光融合
Apr 29 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
Javascript 按位与运算符 (&)使用介绍
2014/02/04 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python 基础教程之包和类的用法
2017/02/23 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
python程序需要编译吗
2020/06/19 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
应届生程序员求职信
2013/11/05 职场文书
高一地理教学反思
2014/01/18 职场文书
走群众路线剖析材料
2014/10/09 职场文书
基层工作经验证明样本
2014/11/16 职场文书