如何从凌乱的文本文件中创建数组

时间:2016-09-20 16:30:52

标签: python-2.7

我在下面的表单中有一个文本文件...

某些文字

某些文字

某些文字

-

数据输入0(i = 0,j = 0);值= 1.000000

数据输入1(i = 0,j = 1);值= 1.000000

数据输入2(i = 0,j = 2);值= 1.000000

数据输入3(i = 0,j = 3);值= 1.000000

对于相当多的行来说等等。总阵列最终为433行×400列。有一串连字符 - 分隔每个新的i值。到目前为止,我有以下代码:

f = open('text_file_name', 'r')
lines = f.readlines()

只是打开文件并将其转换为列表,每行作为单独的字符串。我需要能够创建一个具有i和j位置给定值的数组 - 让我们调用数组A.A [0,0]的值应该是1.000000。我不知道如何从一个凌乱的文本文件(在我的阶段,凌乱的列表)到一个可用的数组

编辑:

预期输出是NumPy数组。如果我能够达到这一点,我可以解决问题中的其他任务

更新: 感谢Lukasz的建议如下。我有点理解你写的代码,但是我不太清楚它使用它。但是,你给了我一些关于做什么的好主意。数据条目从文本文件的第12行开始。 i的值在第22和第27个字符位置内,j的值在第33和第39个字符位置内,值的值在第49和第62个字符位置内。我意识到这对于这个特定的文本文件过于具体,但我的教授对此很好。

现在,我使用此文本文件的格式编写了以下代码

for x in range(12,len(lines)):
    if not lines[x].startswith(' data entry'):
        continue
    else:
        i = int(lines[x][22:28])
        j = int(lines[x][33:39])
        r = int(lines[x][49:62])
        matrix[i,j] = r
print matrix

并给出以下ValueError消息:

    r = int(lines[x][49:62])
ValueError: invalid literal for int() with base 10: '1.000000'

任何人都可以解释为什么会这样(我应该能够将字符串'1.000000'转换为整数1)以及我可以做些什么来纠正这个问题?

1 个答案:

答案 0 :(得分:0)

您可以简单地跳过所有看起来不像数据线的行。 对于检索索引,引入了简单的正则表达式。

import numpy as np
import re


def parse(line):
    m = re.search('\(i = (\d+), j = (\d+)\); value = (\S+)', line)
    if not m:
        raise ValueError("Invalid line", line)
    return int(m.group(1)), int(m.group(2)), float(m.group(3))


R = 433
C = 400
data_file = 'file.txt'
matrix = np.zeros((R, C))
with open(data_file) as f:
    for line in f:
        if not line.startswith('data entry'):
            continue
        i, j, v = parse(line)
        matrix[i, j] = v

print matrix

这里的主要问题是硬编码矩阵大小。理想情况下你'以某种方式在读取数据之前检测目标矩阵的大小,或者使用其他数据结构并从所述结构重建numpy数组。