Python - создать CSV-файл в памяти, а затем закодировать его данные в base64?

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

person Andrius    schedule 16.10.2015    source источник
comment
Отбросьте 'test.csv' и используйте StringIO   -  person jfs    schedule 16.10.2015


Ответы (2)


Если я правильно понял, ваша конечная цель - преобразовать список в строку в формате .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'))
person Crow    schedule 16.10.2015
comment
не изобретайте csv заново, вместо этого используйте модуль csv, например, ваш код не работает, если в col есть кавычка. - person jfs; 20.10.2015

Вы можете напрямую передать StringIO() средству записи csv:

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

Питон 2

>>> 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=='
person jfs    schedule 20.10.2015
comment
from StringIO import StringIO отлично работает для python2, я не знаю, устарел ли он и еще много чего - person Drachenfels; 30.10.2017
comment
@priyankvex — это новый синтаксис для python3 - person wittyurchin; 19.03.2019
comment
Ошибка TypeError возникает при запуске кода с использованием python3. Чтобы исправить это, последняя строка должна быть base64.b64encode(f.getvalue().encode('utf-8')) - person yvesva; 02.10.2019