2016-09-20 97 views
0

我在下面的表格文本文件...如何創建一個陣列從一個混亂的文本文件

一些行文本

一些行文本

一些文本行的數據輸入0(i = 0,j = 0);其中,數據輸入0(i = 0,j = 0);數據輸入0(i = 0,j = 0);數據輸入0(i = 1,值= 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)以及我能做些什麼來糾正問題?

+0

是否要創建列表的列表? Numpy數組?你的預期產出是多少? –

+0

NumPy數組是預期的輸出。對不起,我應該指定 – dvanny

回答

0

您可以簡單地跳過所有看起來不像數據線的行。 對於retieving indicies,引入了簡單的正則表達式。

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數組。

+0

感謝@ Lukaas Rogalski的建議。我已經更新了我的問題,以根據您的答案反映進一步的工作。 – dvanny