在python中读取1D文本文件并将其排序为多维数组

时间:2012-12-03 15:32:55

标签: python multidimensional-array readlines

我正在尝试读取大型数据文件并将其转换为我的其他脚本可以更好地处理的格式。

每个数据文件都有一系列标题,后跟两列引用相关数据点。然后是另一系列标题(在同一列中)和下一组相关数据点。例如:

Sample of a data file

我需要对这些行进行排序并将它们写入由多列组成的文件中。所以每组数据的第一列是相同的(频率),所以我想要得到的应该如下所示:

Sorted data set

我是python的新手,并且还必须找到任何一种成功的方法来管理它。我尝试了一个基本的if语句:

def LoadData(filename):

Datafile = open(filename,'r')

# Define empty lists to read the values into
a1 = []
data=Datafile.readlines()

index = 1   
for line in range(14,len(data)):
    w=data[line].split()
    if type(w[0]) == float:
        a1.append(w[index])
    if re.findall(r'[\w.]THz', w[0]):
        index = index +1

return a1

但由于我无法将列表定义为多维,因此我不知道如何让它将下一系列数据值分配给另一列。定义一个numpy数组对我没有帮助,因为我需要知道开始的确切维度。

我确信必须有一个相对直接的方法来做到这一点,但我找不到它。我很感激任何帮助!

这是评论中要求使用记事本打开的数据: Notepad version of data

3 个答案:

答案 0 :(得分:0)

虽然我还没有使用它,但是pandas看起来对你的用例来说是一个很好的工具。 检查数据框数据结构http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe

和IO工具 http://pandas.pydata.org/pandas-docs/stable/io.html

答案 1 :(得分:0)

您可以在列表中使用列表来模拟所需的二维结构:

arr= []
arr.append(['R1C1', 'R1C2', 'R1C3'])
arr.append(['R2C1', 'R2C2', 'R2C3'])
arr.append(['R3C1', 'R3C2', 'R3C3', 'R3C4'])
# each list can have as many elements as required
print(arr[-1][1]) # last row, second column

如果您的算法需要稀疏数组和对元素的即时访问,您可以使用带有元组作为索引的字典:

arr= {}
arr[1,2]= 'R1C2'
arr[10,5]= 'R10C5'
print(arr[1,2])

答案 2 :(得分:0)

我不完全清楚你的例子中的数字是如何连接到你想要创建的结果表的,但是这里有一个函数,它将在制表符分隔文件中读取并将其转换为每个字段的2d数组表示float的转换为Python float,其余的仍为字符串。

def load_data(filename):
    data = []
    with open(filename) as f:
        for line in f:
            fields = []
            for field in line.strip().split("\t"):
                try:
                    fields.append(float(field))
                except Exception, e:
                    fields.append(field)
            data.append(fields)
    return data

示例:

8.57    0.21
8.58    0.22
8.59    0.23

Curvelabel    = Balance [ 1 (6) ]
Filename      = bil

8.57    0.21
8.58    0.22
8.59    0.23

输出:

[[8.57, 0.21], [8.58, 0.22], [8.59, 0.23],
[''],
['Curvelabel    = Balance [ 1 (6) ]'],
['Filename      = bil'],
[''],
[8.57, 0.21], [8.58, 0.22], [8.59, 0.23]]