1. 程式人生 > >StringIO---像檔案一樣讀寫字串

StringIO---像檔案一樣讀寫字串

有些API僅接受檔案物件,但是你只有一個字串,比如使用gzip模組壓縮字串的時候,StringIO就可以派上用場了

import gzip
import StringIO

stringio = StringIO.StringIO()
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w')
gzip_file.write('hello world')
gzip_file.close()

print stringio.getvalue()  #此方法必須是在stringio.close()呼叫前,否則ValueError

cStringIO:效能更高的StringIO

cStringIO是一個速度更快的StringIO,其介面與StringIO基本類似,但是有以下區別:

  1. 不能構建任何版本的子類,因為它的構造方法返回的是一個built-in型別

    #coding:utf-8
    import StringIO
    
    stringio = StringIO.StringIO(u'helloworld我是')
    print type(stringio)    #<type 'instance'>
    stringio.size = 10      #可以給例項賦任何屬性
    print stringio.getvalue
    () import cStringIO cs = cStringIO.StringIO(u'helloworld') print type(cs) #<type 'cStringIO.StringI'> cs.size = 10 #此處會報錯,因為cStringIO.StringI沒有屬性size print cs.getvalue()
  2. cStringIO不接收中文unicode字元

    cs = cStringIO.StringIO(u'helloworldi我是')
    #異常
    Traceback (most recent call last):
      File "test.py", line 10, in <module>
        cs = cStringIO.StringIO(u'helloworldi鎴戞槸')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-12: ordinal not in range(128)
    

python3 StringIO

python3去掉了StringIO和cStringIO模組,取而代之的是io.StringIO,要寫出相容py2和py3的程式碼的話,使用:

try:
    from cStringIO import StringIO  # py2
except ImportError:
    from io import StringIO  # py3

關注公眾號「Python之禪」(id:vttalk)獲取最新文章 python之禪