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之大话题小函数(1)
Oct 10 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Python base64编码解码实例
Jun 21 Python
python搭建微信公众平台
Feb 09 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
如何使用Django Admin管理后台导入CSV
Nov 06 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
php 在文件指定行插入数据的代码
2010/05/08 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
jquery中radio checked问题
2015/03/16 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python实现拓扑排序的基本教程
2018/03/11 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python常用数据重复项处理方法
2019/11/22 Python
python实现加密的方式总结
2020/01/19 Python
python在不同条件下的输入与输出
2020/02/13 Python
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
安全生产责任书
2014/03/12 职场文书
读书活动总结
2014/04/28 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
地球上的星星观后感
2015/06/02 职场文书
python 详解turtle画爱心代码
2022/02/15 Python