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从sqlite读取并显示数据的方法
May 08 Python
Python实现控制台进度条功能
Jan 04 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Python 常用 PEP8 编码规范详解
Jan 22 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
Django REST framework 视图和路由详解
Jul 19 Python
python sqlite的Row对象操作示例
Sep 11 Python
Pytorch中.new()的作用详解
Feb 18 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
浅谈Python 中的复数问题
May 19 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
一个域名查询的程序
2006/10/09 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php object转数组示例
2014/01/15 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
javascript常用的方法整理
2015/08/20 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
jQuery实现增删改查
2020/12/22 jQuery
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
开办加工厂创业计划书
2014/01/03 职场文书
2014的自我评价
2014/01/13 职场文书
保险经纪人求职信
2014/03/11 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android