2015-10-16 52 views
1

我需要在內存中生成類似數據的csv文件,然後將其編碼爲base64,因此我可以保存它。所以基本上我不想爲此在硬盤上創建文件。現在我通過創建csv文件來解決這個問題,然後編碼它的數據,保存它,然後只是簡單地刪除csv文件(因爲它不再需要)。但是有沒有辦法跳過文件創建,但以同樣的方式保存數據?我的意思是這些數據將被用來使用base64再次打開csv文件。Python - 在內存中生成csv文件,然後將其數據編碼到base64中?

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')   
+1

降''test.csv''和使用'StringIO' – jfs

回答

-1

如果我理解正確,您的最終目標是將列表轉換爲.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')) 
+3

不要重新CSV,使用'csv'模塊,而不是如,如果'col'中有引號,你的代碼就會失敗。 – jfs

10

你可以通過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

'''從io import StringIO''' – priyankvex

+0

'from StringIO import StringIO' for python2 works,we do not know it is deprecated and whatnot – Drachenfels

相關問題