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 Web框架Flask中使用七牛云存储实例
Feb 08 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
Python之Web框架Django项目搭建全过程
May 02 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
Django 用户认证组件使用详解
Jul 23 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
python两个list[]相加的实现方法
Sep 23 Python
利用Python将多张图片合成视频的实现
Nov 23 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 批量替换html标签的实例代码
2013/11/26 PHP
PHP积分兑换接口实例
2015/02/09 PHP
php blowfish加密解密算法
2016/07/02 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Swift中的协议(protocol)学习教程
2016/07/08 Python
详解python中的json的基本使用方法
2016/12/21 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
董事长秘书职责
2014/01/31 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
世界环境日活动总结
2015/02/11 职场文书