2015-10-16 1 views
1

Мне нужно сгенерировать файл csv как данные в памяти, а затем закодировать его на base64, чтобы я мог его сохранить. Поэтому в основном я не хочу создавать файл на жестком диске для этого. Теперь я решаю это, создавая csv-файл, затем кодируя его данные, сохраняя его, а затем просто удаляя файл csv (потому что он больше не нужен). Но есть ли способ пропустить создание файла, но сохранить данные так же? Я имею в виду, что данные будут использоваться для открытия csv-файла снова с помощью base64.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

'' 'from io import StringIO''' – priyankvex

+0

' from StringIO import StringIO' отлично работает для python2, я не знаю, устарели ли они и что еще – Drachenfels

Смежные вопросы