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 相关文章推荐
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python IDLE入门简介
Dec 08 Python
python遍历文件夹下所有excel文件
Jan 03 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
这样写python注释让代码更加的优雅
Jun 02 Python
Python echarts实现数据可视化实例详解
Mar 03 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
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
jQuery 使用个人心得
2009/02/26 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
python之wxPython菜单使用详解
2014/09/28 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
财务工作疏忽检讨书
2014/09/11 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
国富论读书笔记
2015/06/26 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS