在计算机中,IO是Input/Output的简写,也就是输入和输出。
IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。
cStringIO类似于StringIO(用法参见Python:StringIO模块),很多时候我们可以内存中读写str,并非一定要写先文件到磁盘。cStringIO其优势在于cStringIO是由C语言写成,运行速度较StringIO快。如果需要大量使用StringIO,就可以考虑使用cStringIO替代。官方文档:https://docs.python.org/2/library/stringio.html

使用cStringIO时有几点需要非常注意:
  • cStringIO.StringIO([s])是工厂函数,不能自行对其进行扩展。
  • **不能使用不能被转码为ASCII的Unicode编码格式的字符串。
  • 带字符串参数创建的内存文件,如:
    1
    2
    3
    import cStringIO 
    s='abcd'
    a=cStringIO.StringIO(s)

则a为只读文件,没有write()函数。
若不带参数,则同时有read()函数和write()函数。

Example usage:
1
2
3
4
5
6
7
8
9
10
11
12
13
import cStringIO

output = cStringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()
实操例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import xlsxwriter
try:
import cStringIO as StringIO
except ImportError:
import StringIO

# 创建内存文件
xls = StringIO.StringIO()
try:
# 创建文件
workbook = xlsxwriter.Workbook(xls)
# 创建工作薄
worksheet = workbook.add_worksheet()
# 写入标题(第一行)
i = 0
title = ["start_timestamp", "db_instance_id", "lock_time", "query_time", "return_row_count", "parse_row_count", "db_name", "sql", "user", "host"]
worksheet.write_row(0, i, title)
j = 1
for i in res:
worksheet.write(j, 0, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i[0])))
worksheet.write(j, 1, i[1])
worksheet.write(j, 2, i[2])
worksheet.write(j, 3, i[3])
worksheet.write(j, 4, i[4])
worksheet.write(j, 5, i[5])
worksheet.write(j, 6, i[6])
worksheet.write(j, 7, i[7])
worksheet.write(j, 8, i[8])
worksheet.write(j, 9, i[9])
j+=1
workbook.close()
except Exception as e:
print(str(e))

# 将内存文件偏移量改为开始,便于邮件中读出所有内容,并发出
xls.seek(0)

##发送邮件时,从内存读取
attach = MIMEText(xls.read(), "base64", "gb2312")

# 清除内存文件
xls.close()

Comments

2019-03-03