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分析git log日志示例
Feb 27 Python
python实现随机密码字典生成器示例
Apr 09 Python
Python迭代器和生成器介绍
Mar 06 Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
深入理解python try异常处理机制
Jun 01 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
python3.5安装python3-tk详解
Apr 26 Python
详解Python二维数组与三维数组切片的方法
Jul 18 Python
pyinstaller还原python代码过程图解
Jan 08 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
php printf输出格式使用说明
2010/12/05 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
php swoft框架实例用法
2020/12/22 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python学习笔记(二)基础语法
2014/06/06 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
心理健康心得体会
2014/01/02 职场文书
公司股权转让协议书
2014/04/12 职场文书
给下属加薪申请报告
2015/05/15 职场文书
出生证明格式
2015/06/15 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python