2015-11-03 2 views
0

Я пытаюсь прочитать поплавки из текстового файла в массив 2d. Файл имеет следующую структуру:Python, числа из файла в список 2d

1.1 
3.3 
2.4576 
0.2432 
1.3 
235.234 

Я хочу, чтобы прочитать эти строки в 2d списка, и в конечном итоге с нижеследующим.

data = [[1.1, 3.3] 
     [2.4576, 0.2432] 
     ... 
     [1.3, 235.234]] 

Мой код до сих пор:

f = [] 
with open(str(i)) as fl: 
    for line in fl: 
     f.append(float(line)) 

Существует простой и «хороший» способ сделать это, не используя много помощи переменных?

(И длина файла и размер массива (х * х) известны)

ответ

0
f = [] 
with open(str(i)) as fl: 
    while True: 
     line1,line2 = float(fl.readline()),float(fl.readline()) 
     f.append([line1,line2]) 
     if not (line1 and line2): break 

это работает, потому что линия задается вызовом fl.readline(), так что это будет читать дополнительная линия каждый раз. это, очевидно, будет приводить к ошибкам, если преобразование поплавок не удается, но он будет работать, если все линии правильно отформатирован

вы также можете сделать:

f = fl.read().splitlines() 
f = [f[x:x+2] for x in range(0,len(f),2)] 

что путь более вещий

Editted: ValueError: Mixing iteration and read methods would lose data был называется, если for цикл используется с Readline

+0

** ValueError: ** Смешивание итераций и методов чтения потеряют данные –

+0

, что правильно, я не знал об этой ошибке. я изменил код соответственно –

0

Если вы используете NumPy, это, вероятно, немного более простой:

arr = np.loadtxt('arr.txt') 
arr = arr.reshape((len(arr)//2, 2)) 

, например. из колонки цифр: 1. 1.1 2. 2.2 ... 6. 6.6 вы получите:

array([[ 1. , 1.1], 
    [ 2. , 2.2], 
    [ 3. , 3.3], 
    [ 4. , 4.4], 
    [ 5. , 5.5], 
    [ 6. , 6.6]]) 
-1

Если вы используете NumPy (который вы должны, если вы делаете какую-либо серьезную числовую работу), то вы можете изменить линейный список

import numpy as np 

n = np.loadtxt(file_name) 
n.reshape((-1,2)) 

-1 в форме, чтобы позволить numpy вычислить размерный размер

0

Это может быть более обобщенное решение.

finalList=[] 
with open("demo.txt") as f: 
    while True: 
     try: 
      innerList = [float(next(f).strip()) for x in xrange(2)] 
      finalList.append(innerList) 
     except StopIteration: 
      break 

print finalList 

Выход:

[[1.1, 3.3], [2.4576, 0.2432], [1.3, 235.234]] 
0

Это будет делать это:

lines = [line.rstrip('\n') for line in open('file.txt', 'r')] 

iterate_list = iter(lines) 
for two_elem in iterate_list: 
    print two_elem, next(iterate_list) 

Для этого содержимого файла:

1.1 
3.3 
2.4576 
0.2432 
1.3 
235.234 

Вы получите:

1.1 3.3 
2.4576 0.2432 
1.3 235.234 
Смежные вопросы