引用实例变量中的行

时间:2014-04-08 13:30:15

标签: python variables instance

道歉,如果这在其他地方得到解答,但我找不到(或者可能理解)任何看似我正在尝试做的事情......

我有一个大约的文件。 60000行和136列。从这里我想提取大约20列,并创建了一个实例变量来存储数据。然后根据几个列中的条目解析和剪切数据,并将其移动到实例变量的新副本以保持一致性。目前我正在为实例中的每一列执行此操作,并且我希望一次复制整行,但无法找到引用实例变量中的行的方法。我正在做和想做的事情的例子如下。

如果有人能指出我正确的方向或建议更好的方法做同样的事情(而不是使用实例变量),我将非常感激。


实例变量:

class Instance_Object:

###------------------------------------------------------------------
### __init__ Function to create the object
### 
###          Stores all the interesting parameters from the data 
###------------------------------------------------------------------

def __init__(self):

    self.a = []
    self.b = []
    self.c = []
    # etc

当前主要代码:

result = pyf.open(datapath+data_filename)
header = result[1].header
file_data = result[1].data

data_a, data_b = Instance_Object(), Instance_Object()

data_a.a = file_data.VAR1
data_a.b = file_data.VAR2
data_a.c = file_data.VAR3
#(etc)

for i in range(len(data_a.a)):
    if 0.0 <= data_a.a[i] <= 100.0: 
        if -1.0 <= data_a.b[i] <= 1.0:
            data_b.a.append(data_a.a[i])
            data_b.b.append(data_a.b[i])
            data_b.c.append(data_a.c[i])
            # etc

我想做什么:

for i in range(len(data_a.a)):
    if 0.0 <= data_a.a[i] <= 100.0: 
        if -1.0 <= data_a.b[i] <= 1.0:
            data_b.append(data_a[i])
            # i.e. append the entire row from data_a into data_b whilst 
            # maintaining the structure

1 个答案:

答案 0 :(得分:1)

不存储数据列,而是存储行列表。

您可以组合操作,而不是存储所有列,然后选择所需的列,然后筛选所需的行,

def file_to_rows(fname, line_to_row=None, row_filter=None, skip_header=False, mode="r"):
    line_to_row |= lambda line: line
    row_filter  |= lambda row:  True

    with open(fname, mode) as inf:
        for line in inf:
            row = line_to_row(line)
            if row_filter(row):
                yield row

def line_to_row_items(items):
    max_split = max(items) + 1
    def fn(line):
        row = line.split(None, max_split)
        return [row[item] for item in items]
    return fn

def row_filter(row):
    return (
             0. <= row[0] <= 100.
        and -1. <= row[1] <=   1.
    )

data = list(file_to_rows(
    "mydata.txt",
    line_to_row_items([0, 1, 4, 5, 6, 9, 10, 15, 18, 21]),   # which columns to keep
    skip_header = True
))