使用StringIO模块可以在内存中创建文件,文件内容格式为字符串。创建的文件可以当成普通文件进行读取和写入等操作。

StringIO可以应用在对需要对各种文件进行中间处理的过程,这样可以避免中途写入更改的文件并重新读出的过程。

StringIO带有3个常用函数:
StringIO([buffer]) # 不带参数则在内存中创建空文件,带参数则创建内容为buffer(字符串)的文件
getvalue() # 获取内存文件的内容
close() # 释放内存

基本使用方法:

import StringIO

a = StringIO.StringIO()
a.write('First')
print a.getvalue()
# First
a.write('Second')
print a.getvalue()
# FirstSecond
a.close()

b = StringIO.StringIO('Third')
b.write('F')
print b.getvalue()
# Fhird
b.close()

注意:如果使用带参数StringIO(),一定要注意协调好当前位置指针,适当利用seek()设置当前位置指针,tell()获取当前位置指针。
上面的例子就是出错的情况,出现了字符串覆盖,可以进行如下修改:

import StringIO

s = 'Third'
b = StringIO.StringIO(s)
print b.tell()
# 0
b.seek(len('Third'))
print b.tell()
# 5
b.write('Fourth')
print b.getvalue()
# ThirdFourth
b.close()

还有如下错误情况:

import StringIO

b = StringIO.StringIO()
b.write('Fivth')
print b.read()
#
b.close()

上述无输出,因为write()同时更改了当前位置指针,需要进行如下修正read()才能正常工作:

import StringIO

b = StringIO.StringIO()
b.write('Fifth')
b.seek(0)
print b.read()
# Fifth
b.close()

还需要注意StringIO可以接受UnicodeASCII编码的字符串,但不能混用,否则在使用getvalue()时会出现UnicodeError错误。

此外Python还提供了一个更快速的库:cStringIOPython:cStringIO模块)。