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连接oracle数据库实例
Oct 17 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
使用python3构建文件传输的方法
Feb 13 Python
eclipse创建python项目步骤详解
May 10 Python
python腾讯语音合成实现过程解析
Aug 01 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
Python数据正态性检验实现过程
Apr 18 Python
python -v 报错问题的解决方法
Sep 15 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
艺术应用与设计个人的自我评价
2013/11/23 职场文书
优秀教师工作感言
2014/02/16 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
2015年个人思想总结
2015/03/09 职场文书
创业计划书之水果店
2019/07/18 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL