Python - 在内存中生成csv文件,然后将其数据编码为base64?

时间:2015-10-16 08:57:17

标签: python csv memory base64 stringio

我需要在内存中生成类似数据的csv文件,然后将其编码为base64,这样我就可以保存它。所以基本上我不想为此在硬盘中创建文件。现在我通过创建csv文件然后编码其数据,保存它然后只是删除csv文件(因为它不再需要)来解决这个问题。但有没有办法跳过文件创建,但以同样的方式保存数据?我的意思是数据将用于使用base64再次打开csv文件。

import base64
import csv
from StringIO import StringIO
import os

def test_binary(self):
    mylist = [['a', 'b'], ['c', 'd']]
    with open("test.csv", "wb") as f:
        writer = csv.writer(f)
        writer.writerows(mylist)   

    myfile = open('test.csv', 'r')
    stream = StringIO(myfile.read())

    encoded = base64.b64encode(stream.getvalue())

    self.test = encoded
    myfile.close()
    os.remove('test.csv')        

2 个答案:

答案 0 :(得分:17)

您可以直接将StringIO()传递给csv编写器:

>>> import base64
>>> import csv
>>> from StringIO import StringIO
>>> mylist = [['a', 'b'], ['c', 'd']]
>>> f = StringIO()
>>> csv.writer(f).writerows(mylist)
>>> base64.b64encode(f.getvalue())
'YSxiDQpjLGQNCg=='

答案 1 :(得分:0)

如果我理解正确,你的最终目标是将一个列表变成.csv格式的字符串,并将其编码为base64。如果是这种情况,您根本不需要创建.csv文件。

import base64

mylist = [['a', 'b'], ['c', 'd']]

# Creating the csv formatted string
csv_line_length = len(max(mylist,key=len))
csv_string = ''
for row in mylist:
    temp_row = ['"' + col + '"' for col in row]
    while len(temp_row) < csv_line_length:
      temp_row.append([])
    csv_string += ','.join(temp_row) + '\n'
# Encoding the string to base64
encoded = base64.b64encode(csv_string.encode('utf-8'))