Python标准库—StringIO模块和BytesIO模块

 2016年12月31日 19:56   Nick王   开发    0 评论   447 浏览 

StringIO模块用来在内存中读写数据。在Python2中还包含有更快的cStringIO模块来替代StringIO模块。在Python3中StringIO模块被包含在了io包中,由io包来提供更快的StringIO模块。

>>> try:
...     from io import StringIO
... except:
...     try:
...         from cStringIO import StringIO
...     except:
...         from StringIO import StringIO


接下来的操作就跟读写文件一模一样了

>>> fn = StringIO()
>>> fn.write('line 1\n')
>>> fn.write('line 2\n')
>>> fn.seek(0)  #将文件指针位置移动到开头
>>> print(fn.read())
line 1
line 2

>>> fn.close()


不同于文件读写的地方是StringIO还提供了一个getvalue()的方法用于获得写入后的str

>>> fn = StringIO()
>>> fn.write('first\n')
>>> fn.write('second\n')
>>> print(fn.getvalue())
first
second

>>> fn.close()


StringIO类实例化的时候还可以提供一个参数,参数类型是字符串,表示用字符串初始化一个StringIO;字符串就是StringIO中的内容。

>>> from StringIO import StringIO
>>> fn = StringIO("iBash")
>>> fn.getvalue()   ##获取内容,为初始化提供的字符串
'iBash'
>>> fn.write('a')   ##这里是从头开始写入的,要想从结尾开始写入可以利用seek()函数将指针移到末尾,不过这里的seek和文件操作的seek不一样
>>> fn.getvalue()
'aBash'
>>> fn.close()
>>>


cStringIO和StringIO不同的地方,当使用cStringIO初始化的时候提供参数,那么是只读的不提供write方法

>>> from cStringIO import StringIO
>>> fn = StringIO("iBash")
>>> fn.getvalue()
'iBash'
>>> fn.write('a')    ###看这里
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    fn.write('a')
AttributeError: 'cStringIO.StringI' object has no attribute 'write'
>>> fn.close()
>>>


Python2.7 为了兼容 Python3 也提供了io.StringIO模块,不过由于Python3 字符串默认都是unicode,所以在Python2.7中要注意

>>> import sys
>>> sys.version
'2.7.12 (default, Nov 19 2016, 01:44:41) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'
>>> from io import StringIO
>>> fn = StringIO("iBash")   ##看这里
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    fn = StringIO("iBash")
TypeError: initial_value must be unicode or None, not str  ###看这里
>>> fn = StringIO(u"iBash")  ##看这里
>>> fn.getvalue()
u'iBash'
>>> fn.write('a')   ##看这里
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    fn.write('a')
TypeError: unicode argument expected, got 'str'  ##看这里
>>> fn.write(u'a')  ##在io.StringIO模块中使用write方法会返回写入数据的长度
1L           ##看这里
>>> fn.getvalue()
u'aBash'
>>> fn.close()
>>>



BytesIO和StringIO不一样的地方是StringIO是针对字符串的,而BytesIO是针对字节的。由于在Python2中没有Bytes数据类型,所以这个模块是Python3中独有的。


Python2 中的字符串编码解码和Unicode

>>> import sys
>>> sys.version
'2.7.12 (default, Nov 19 2016, 01:44:41) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'
>>> a = 'hello'
>>> type(a)  #str类型
<type 'str'>
>>> a.decode('utf-8')  #str解码为unicode
u'hello'
>>> b = a.decode('utf-8')
>>> type(b)   #解码后的类型为unicode
<type 'unicode'>
>>> b.encode('utf-8')
'hello'

>>> c = u'你好'
>>> type(c)
<type 'unicode'>
>>> c.encode('utf-8')
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> d = c.encode('utf-8')
>>> d
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> type(d)
<type 'str'>
>>> d.decode(u'utf-8')
u'\u4f60\u597d'
>>> print(u'\u4f60\u597d')
你好
>>> len(d)
6
>>>


Python3中的str和Bytes

>>> import sys
>>> sys.version
'3.5.2 (default, Dec  1 2016, 10:42:40) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'
>>> a = 'hello'
>>> type(a)
<class 'str'>   ##Python3中的str就是unicode
>>> a.encode('utf-8')
b'hello'
>>> b = a.encode('utf-8')
>>> type(b)
<class 'bytes'>
>>>


BytesIO使用方法

>>> from io import BytesIO
>>> fn = BytesIO()
>>> fn.write('你好'.encode('utf-8'))
6
>>> fn.getvalue()
b'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> b = fn.getvalue()
>>> b.decode('utf-8')
'你好'
>>> fn.close()
>>>




如无特殊说明,文章均为本站原创,转载请注明出处