如何将Python字典写入文件而不使其成为字符串?

问题描述 投票:3回答:3

我想在一个文件中写一个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)
python csv dictionary pickle jsonpickle
3个回答
1
投票

从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的整列是dict,那么您可以将其保存为CSV normaly(使用除,之外的分隔符),然后将这个类似字典的列字符串映射到字典:

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

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


5
投票

只需使用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可调用来写入和读取文件。在上面的代码片段中,只需用pickle替换json,它将与规定的数据类型相同。此外,检查文档,以便json序列化输出填充漂亮的缩进,以便真正可读:https://docs.python.org/3/library/json.html


3
投票

我想你尝试做的是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)
© www.soinside.com 2019 - 2024. All rights reserved.