【问题标题】:How to write Python dictionaries to file without make them strings?如何将 Python 字典写入文件而不使它们成为字符串?
【发布时间】:2018-06-03 06:42:01
【问题描述】:

我想将 Python 字典列表写入文件。但是,我需要字典(和其中的列表)来保留字典,即当我加载文件进行处理时,我希望它们使用字典而不必使用字符串。

这是我将数据写入字符串的示例代码,有没有办法保留原始 Python 数据结构(在实际代码中,列表数据有数百个字典,每个字典可能有数百个列表作为值)。我不能简单地腌制数据,原因有很多(其中一个是文件需要是人类可读的)。

import csv
import pandas as pd

def write_csv_file(data, iteration):
    with open('%s.csv' % 'name', 'wb') as data_csv:
        writer_data = csv.writer(data_csv, delimiter=',')
        for d in data:
            writer_data.writerow([iteration] + [d])


data = [{'a':1, 'b':2}, {'e':[1], 'f':[2,10]}]
iteration = 1
write_csv_file(data, iteration)

目前我使用pandas读取数据文件,按照以下方式处理数据。

d = pd.read_csv('name.csv')
d = pd.DataFrame(d)

【问题讨论】:

  • 那是不可能。您写入读取文件的所有内容都是string。你必须想出一个聪明的方法来从dictstring,反之亦然。或者使用某种库。
  • 您需要某种形式的序列化,例如picklejson.
  • @Ev.Kounis 这有点牵强。你如何定义字符串?对我来说,这是人类可读的字符序列。但是,文件处理字节。您可以将任何字节序列写入文件,例如使用pickle 创建的序列化字典。
  • EV。 Kounis:您写入或读取到文件的所有内容都是字节序列,而不是文本字符串。而且Python有几种方法可以将其数据结构序列化和反序列化为字节序列,这些方法足够聪明。

标签: python csv dictionary pickle jsonpickle


【解决方案1】:

我认为您尝试做的是data serialization。我认为最常见和众所周知的序列化格式之一是JSON。还有一个python模块可以读写json文件,叫做json

这是一个将转储数据写入json文件的示例函数(类似于@jsbueno在另一个答案中写的那个)

import json

def write_json_file(data):
     with open('%s.json' % 'name', 'wb') as data_file:
          json.dump(data, data_file)

【讨论】:

    【解决方案2】:

    从 Python 2.6 开始,您可以使用 ast.literal_eval

    import ast
    ast.literal_eval('{"a":1, "b":2, "c":3}')
    {'a': 1, 'b': 2, 'c': 3}
    

    如果您的 pandas DataFrame 的整列是一个字典,那么您可以将其保存为 CSV 正常(使用除 , 以外的分隔符),然后将此类似字典的列字符串映射到字典中:

    df['DICTIONARY_COLUMN'].map(ast.literal_eval)
    

    当然,您可以忽略数据框部分 - 您也可以循环或以任何您喜欢的方式转换它们。重要部分是:ast.literal_eval 并使用非逗号分隔符(因为您在类似字典的字符串中使用逗号)。

    【讨论】:

      【解决方案3】:

      只需使用 pickle 而不是 CSV 将您的数据写入文件 https://docs.python.org/3/library/pickle.html

      import pickle
      
      def write_csv_file(data):
      
          with open('%s.pickle' % 'name', 'wb') as data_file:
                pickle.dump(data, data_file)
      

      Pickle 将正确序列化和恢复大量数据类型,包括日期时间和大多数开箱即用的用户定义类。

      但是,如果您需要使用第三方工具手动编辑文件,或者希望它是人类可读的,它可能不是最佳选择。

      如果您只需要数字、无、布尔值、列表和字典,并且更喜欢人类可读的文本文件,那么 JSON 可能是一个不错的选择。 Python 的 json 模块使用与 picle 相同的接口,使用 dumpload 可调用对象写入和读取文件。在上面的代码 sn-p 中,只需将 pickle 替换为 json,它与规定的数据类型相同。此外,检查文档,以便 json 序列化输出填充有很好的缩进以便真正可读:https://docs.python.org/3/library/json.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-17
        • 2021-11-03
        • 1970-01-01
        • 2013-07-01
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多