【问题标题】:Python - generate csv file in memory and then encode its data into base64?Python - 在内存中生成 csv 文件,然后将其数据编码为 base64?
【发布时间】:2016-01-14 23:02:43
【问题描述】:

我需要在内存中生成类似于数据的 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')        

【问题讨论】:

  • 删除 'test.csv' 并使用 StringIO

标签: python csv memory base64 stringio


【解决方案1】:

您可以将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=='

Python 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=='

【讨论】:

  • from io import StringIO
  • from StringIO import StringIO 适用于 python2,我不知道它是否已被弃用等等
  • @priyankvex - 这是 python3 的新语法
  • 使用python3运行代码时出现TypeError。要修复它,最后一行应该是base64.b64encode(f.getvalue().encode('utf-8'))
【解决方案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'))

【讨论】:

  • 不要重新发明 csv,改用 csv 模块,例如,如果 col 中有引号,您的代码将失败。
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多