0

假设我有一些由我的绘图应用程序生成的数据系列,我想将它们存储并随意在 .csv 中调用它们。

每个数据集有四个特征。一个名称、一组 x 值 ( xvals)、一组 y 值 ( yvals) 和父级。

我目前正在想象一个 .csv 文件,我会在 Excel 中生成那种文件,我在想:

name, DataSet1
xvals, 1,2,3,4,5
yvals, 1,4,9,16,25
parent, None
<linebreak>
name, DataSet2
xvals, 1,2,3,4,5
yvals, 21,23,24,25,26
parent, None
<linebreak>

等等。感觉不是很自然,而且实现看起来有点难看。有没有人有什么建议?

在我的应用程序中,每个 DataSeries 实例已经包含了我需要的所有数据。如果我实际上可以保存实例对象本身(或它们的集合),那么在此期间也可以正常工作(尽管我最终希望能够导出数据以在 Excel 中使用)

我想告诉python:

  1. 读取文件中的所有行。每次阅读“空白”行时,插入分隔符。将每组线视为一个数据集。

  2. 阅读包装中每一行的第一项。这是该行中其余单元格包含的信息类型。获取该引用,并将所有相邻单元格中的数据作为列表放入相应的对象属性中。

我有办法做到这一点,但它涉及到很多尴尬的对角色和位置的具体调用,这让我想起了“GOTO”语句。我想要一些更有机和 Pythonic 的东西。

目前的做法:

class DataSet(object):
    def __init__(self, name, xvals, yvals, parent=None):
        self.name = name
        self.xvals = xvals
        self.yvals = yvals
        self.parent = parent

loaded_data = csv.reader(open('csv_data.csv', 'r'), delimiter=',')

container = []
dict = {}
for row in loaded_data:
    if list(row)[0] == '':
        container.append(dict)
        dict = {}
    else:
        dict[list(row)[0]] = filter(None,list(row)[1:])
container.append(dict)
4

2 回答 2

3

将数据集和父级设置为列,因此您的数据如下所示:

"Dataset","Parent","XVal","YVal"
DataSet1,None,1,1
DataSet1,None,2,4
...
DataSet2,None,1,21
DataSet2,None,2,23

通常,要将数据转换为表格格式(如 CSV),您需要将其重组为行。如果您的信息不是与一行相关,而是与某组行相关联(例如,“数据集名称”),您应该重铸这是一个其值在相关行中重复的列。当您读入数据时,您可以轻松地过滤此列以获取相关组。

顺便说一句,您可能想查看pandas,这是一个库,它提供了处理表格数据的有用工具(包括读取和写入 CSV 以及按照我描述的方式对列值进行分组)。

编辑:根据您的评论,您似乎没有询问如何使用 CSV 来存储您的数据。您在问如何解析您的临时格式。答案是“自己编写解析器”;你可以看看pyparsing。CSV 库不会为您解析它,因为您的格式不是真正的 CSV。电子表格不适用于您的格式,因为它不是表格的。如果您想使用预制工具来处理您的数据,您需要更改您的数据以使用预先存在的格式。从长远来看,这将导致更容易处理,并且将数据更改为正确的格式并不困难。

于 2012-07-24T20:42:18.847 回答
0

您可以使用 json,而不是使用 csv。该json模块适用于序列化非表格数据。因此,如果您有一个数据集列表,如下所示:

data_sets = [{"name": "DataSet1", "xvals": [1,2,3,4,5], 
              "yvals": [1,4,9,16,25], "parent": None},
             {"name": "DataSet2", "xvals": [1,2,3,4,5], 
              "yvals": [21,23,24,25,26], "parent": None}]

您应该可以轻松地使用 json 将该数据导出和导入到文件中。

import json

# export to a file
with open("path/to/file.json", "wb") as f:
    f.write(json.dumps(data_sets))

# import from a file
with open("path/to/file.json", "rb") as f:
    loaded_data = json.loads(f.read())

print loaded_data

这不会帮助您将数据加载到 excel 中,但它提供了一种方便的方式将简单的 python 数据结构转储到文件中以供以后使用。

但请注意,当从 json 文件加载时,您最终会得到 unicode 对象而不是 python 的基本str对象,这在 python 2 中可能看起来有点奇怪。例如,在您执行了上面的行之后,请注意u之前每个键:

>>> print loaded_data[0]
{u'xvals': [1, 2, 3, 4, 5], u'yvals': [1, 4, 9, 16, 25], 
u'name': u'DataSet1', u'parent': None}

这只是意味着键现在是 unicode 字符串。这不是一件坏事,并且仍然可以与普通str对象进行比较:

>>> 'xvals' == u'xvals'
True
>>> print loaded_data[0]['xvals']
[1, 2, 3, 4, 5]
于 2012-07-24T20:54:33.350 回答