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 连连看连接算法
Nov 22 Python
通过python下载FTP上的文件夹的实现代码
Feb 10 Python
python使用urllib2提交http post请求的方法
May 26 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
python实现画图工具
Aug 27 Python
python switch 实现多分支选择功能
Dec 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
php cout<<的一点看法
2010/01/24 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
python抓取京东商城手机列表url实例代码
2013/12/18 Python
python遍历目录的方法小结
2016/04/28 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
python基于Selenium的web自动化框架
2019/07/14 Python
python计算n的阶乘的方法代码
2019/10/25 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
Python requests设置代理的方法步骤
2020/02/23 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
本科毕业生求职自荐信
2014/02/03 职场文书
小学新教师个人总结
2015/02/05 职场文书
钱学森电影观后感
2015/06/04 职场文书
干部考核工作总结
2015/08/12 职场文书