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 正则表达式操作指南
May 04 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
python实现坦克大战
Apr 24 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
解决python使用list()时总是报错的问题
May 05 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
常用的10个Python实用小技巧
Aug 10 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
清空上传控件input file的值
2010/07/03 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
Python入门教程之if语句的用法
2015/05/14 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
教师岗位职责范本
2013/12/29 职场文书
国培教师自我鉴定
2014/02/12 职场文书
服装促销活动方案
2014/02/23 职场文书
师范毕业生求职信
2014/07/11 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
品质保证书格式
2015/02/28 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python