python - 在输入数据和属性中存储可变数量的列

时间:2012-07-24 13:43:59

标签: python

我们有几个在线数据来源(数字):

[ source 1 ]
1 52 61 17
1 2 2 12
31 4 42 1


[ source 2 ]

2 52 6 2 1 2
2 37 4 5 4 35
2 3 74 5 93 7
3 83 8 8 65 0

[ source X ]
... 

正如您所看到的,每个源中有不同数量的列。我想要做的是阅读(使用所有数据源的相同脚本)所有行但是以允许我对这些数字进行操作的方式(即右对齐它们,如果它们大于Y值则强调其中一些等)。所以我还需要存储关于每个数字的一​​些额外属性。存储这些数据+关于它们的属性的最佳数据结构是什么?

更新: 由于有人说解决方案取决于我想对这些数字做什么,我会尝试更好地解释:

    *我想将它们与前一行但来自同一列的值进行比较 *如果它们差别很大(很多=自己定义)我想记录它并以特定的格式打印它们(它们将打印在控制台上)
    *如果它们超过/低于某个特定值,我将记录哪个列,调整对齐等以排列它们

2 个答案:

答案 0 :(得分:1)

我会尝试这样的东西(纯Python):

rows = []
for source in list_of_filenames:
    with open(source) as f:
        for line in f:
            if line == '' or line.isspace():
                continue
            rows.append([(int(num), {}) for num in line.split()])

这将为您提供元组列表的列表。每个元组都包含一个数字和一个字典,您可以在其中存储元数据。

答案 1 :(得分:1)

使用基本python数据结构的自定义数据结构

这是数据(以及元值)的来源:

  • 文件中有多行。因此,我们为每一行分配一个名称。说line1
  • 每一行都有几个数字,每个都有一些属性。

现在,

  1. 我们构建了一个list,其中tuples与文件中的行数一样多。{/ li>
  2. 每个元组的第一个元素是TupleName,第二个元素是存储数字数据的list
  3. 在第二个元素中,连续的数字与元组一样多。每个元组包含numberdict属性的位置。
  4. 示例:

    data_structure = [ ("line1", [ ("num1", {"attr1" : value, "attr2" : value, } ),
                                   ("num2", {"attr1" : value, } ),
                                    ("num3", {} ),
                                 ]
                        ),
    
                        ("line2", [ ("num1", {"attr1" : value, "attr2" : value, } ),
                                    ("num2", {"attr1" : value, "attr2" : value, } ),
                                ]
                        ),
    
                        ("line3", [ ("num1", {"attr1" : value, "attr2" : value, } ),
                        ],
    ]
    

    这个显然看起来很复杂。但是,正如我们现在标准化数据结构一样,我们可以编写class来定义添加,删除或编辑attributesnumberslines的方法。最重要的部分是,确保编写一个方法,从文件对象创建我们的数据结构。

    现在,你摆脱了复杂性。

    您可以使用lists代替tuples,但我只是为了不干扰我们定义的数据结构而添加。

    样本类

    可能是原始的,但它应该告诉你我实际上要解释的是什么

    class data (object):
        def __init__(self, file_name):
            self.file_name = file_name
            self.data = open(self.file_name, "r").readlines()
            # The Data Str
            self.ds = self.makeDS()
    
        def getNumList(self, line_count):
            return self.data[line_count][:-1].split()
    
        def makeDS (self):
            ds = []
            for eachLine in self.data:
                line_count = self.data.index(eachLine)
                num_list = self.getNumList(line_count)
    
                eachLine_num_data = []
                for aNum in num_list:
                    num_attr = {}
                    eachLine_num_tuple = (aNum, num_attr)
                    eachLine_num_data.append(eachLine_num_tuple)
                eachLine_tuple = (line_count, eachLine_num_data)
                ds.append(eachLine_tuple)
            return ds
    
        def getAttr (self, line_count, num_count):
            attr = self.ds[line_count][1][num_count]
            return attr
    
        def add_attr (self, line_count, num_count,
                        attr_name, attr_value):
            attr = self.ds[line_count][1][num_count][1]
            attr[attr_name] = attr_value
    
    
    o = data("file.txt")
    o.add_attr(0,0,"name", "value")
    print o.getAttr(0, 0)
    

    输出

    >>> ('2', {'name': 'value'})
    

    如何在文件中应用属性

    这有点复杂(并非完全)。标准文本文件不支持(下划线,粗体,斜体......)等功能。 .docx或任何其他格式更有可能是zip archive格式的openXML。您需要知道如何使用它们才能应用about属性。