【问题标题】:How can I pickle a python object into a csv file?如何将 python 对象腌制到 csv 文件中?
【发布时间】:2018-01-26 06:58:00
【问题描述】:

我正在尝试将 python 对象腌制到 csv 文件中。我想将对象的泡菜写为文件中的第三列。我想使用 pickle 来避免为我的复杂对象编写序列化。

写入 csv 的代码:

 with open(self.file_path, 'a') as csv_file:
        wr = csv.writer(csv_file, delimiter='|')
        row = ['klines', symbol]
        row.extend(pickle.dumps(object))
        wr.writerow(row)

读取 csv 的代码:

 with open(self.simulation_file_name, 'r') as csv_file:
        line = csv_file.readline()
        while line != '':
            line = line.strip('\n')
            columns = line.split('|')
            event_type = line.pop(0)
            symbol = line.pop(0)
            pickled = line.pop(0)
            klines = pickle.loads(klines)

我收到以下错误:

TypeError: a bytes-like object is required, not 'str'

【问题讨论】:

  • 在 csv 文件中存储的不是腌制的 Python 对象本身而是保存在磁盘某处的指向它的链接不是更好吗?
  • CSV 文件被设计成人类可读的,但 Pickle 不是。
  • pickle.dumps 给出了一个 bytes 对象。带有bytes 对象的list.extend 使用int 扩展列表,从而产生['klines', symbol, 128, 3, 93...](在Python3 中测试)。这是你想要的吗?或者你的意思是row.append
  • 一个完整的回溯会很好
  • 你能告诉我为什么你想这样做没有 x/y 问题吗?

标签: python csv pickle python-3.6


【解决方案1】:

要在 CSV 等文本文件中写入字节/二进制文件,请使用base64 或其他方法来避免任何转义问题。代码简化 & 假定使用 python3。

import base64
with open('a.csv', 'a', encoding='utf8') as csv_file:
    wr = csv.writer(csv_file, delimiter='|')
    pickle_bytes = pickle.dumps(obj)            # unsafe to write
    b64_bytes = base64.b64encode(pickle_bytes)  # safe to write but still bytes
    b64_str = b64_bytes.decode('utf8')          # safe and in utf8
    wr.writerow(['col1', 'col2', b64_str])


# the file contains
# col1|col2|gANdcQAu

with open('a.csv', 'r') as csv_file:
    for line in csv_file:
        line = line.strip('\n')
        b64_str = line.split('|')[2]                    # take the pickled obj
        obj = pickle.loads(base64.b64decode(b64_str))   # retrieve

附:如果你写的不是utf8文件(比如ascii文件),直接替换编码方式即可。

附:在 CSV 中写入字节是可能的,但并不优雅。一种替代方法是转储整个 dict,其中转储对象作为值并将键存储在 CSV 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 2016-10-13
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多