0

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

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

数据文件示例

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

排序数据集

我是 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 数组也对我没有帮助,因为我需要知道确切的尺寸才能开始。

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

这是按照评论中的要求使用记事本打开的数据: 记事本版本的数据

4

3 回答 3

0

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

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

于 2012-12-03T16:04:35.643 回答
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])
于 2012-12-04T09:04:32.397 回答
0

我并不完全清楚您的示例中的数字如何连接到您要创建的结果表,但这里有一个函数将读取制表符分隔的文件并将其转换为二维数组,其中每个字段代表一个float 被转换为 Python 浮点数,其余的仍然是字符串。

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]]
于 2012-12-04T09:14:22.633 回答