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)
4

3 回答 3

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

于 2017-12-20T16:32:57.653 回答
3

我认为您尝试做的是数据序列化。我认为最常见和众所周知的序列化格式之一是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)
于 2017-12-20T16:35:19.417 回答
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 的整个列是一个字典,那么您可以将其保存为 CSV 正常(使用除 以外的分隔符,),然后将此类似字典的列字符串映射到字典中:

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

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

于 2017-12-20T16:52:04.437 回答