2014-02-18 4 views
2

Если у меня есть файл в этом формате:Как прочитать файл и сохранить данные в список

1 2 3 4 5 
6 7 8 9 10 

Что такое правильный способ, чтобы прочитать файл и сохранить каждую цифру в виде списка в Python?

x_table = [] 
for eachLine in filename_1: 
#Set up temp variable 
    x_table.append([]) 
    tmpStr = '' 
#Loop through each character in the line 
    for char in eachLine: 
    #Check whether the char is a number 
     if char.isdigit(): 
      tmpStr += char 
     elif char == ' ' and tmpStr != '': 
      x_table[eachLine].append(int(char)) 

Я получил эту ошибку:

type: list indices must be integers, not str. 

ответ

0

Читайте каждую строку и использовать split() для разделения цифр на отдельные числа:

mat = [] 
for line in open('file.txt').readlines(): 
    mat.append(line.split()) 

После этого, если вы хотите, вы можете проверить если все строки имеют одинаковое количество элементов.

0

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

Вы можете просто сохранить текущий счет:

x_table = [] 
idx = 0 
for eachLine in filename_1: 
    # ... 
    x_table[idx].append(int(char)) 
    idx += 1 

EDIT: или, если вы хотите, чтобы пойти с подходом Элиас предложил (см ниже), вы можете использовать список понимание подрезать элементы, которые не цифры:

raw_mat = [] 
f = open('file.txt') 
for line in f.readlines(): 
    raw_mat.append(line.split()) 
f.close() 

mat = [] 
for row in raw_mat: 
    mat.append([i for i in row if i.isdigit()]) 
0

Если вам нужны номера по обработке этой функции будет работать: http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Если вам не нужно изменять массив из-массивов (данные загружаются в numpy.ndarray, который является эффективным, если вам нужен номер и математическая обработка) ,

Другое решение:

Если вам нужен массив из-массивов, и вы не хотите, чтобы изменить свой основной код, обратите внимание, что каждый элемент в течение ... в ... не показатель положение, но фактический элемент.

, чтобы получить позицию индекса сделать: для I, V в перечисление, (filename_1):

И даже тогда, если filename_1 является строкой, это не нормально. вы должны указать там файл-файл (он повторяется и по очереди).

Для каждой линии (eachLine) вы могли бы добавить к x_table следующий код:

x_table.append([int(s) for s in eachLine.split()]) 
#eachLine.split() will break eachLine by whitespace-strings. 

запомнить, чтобы захватить исключения здесь.

полный код:

x_table = [] 
for eachLine in open(filename_1, "r"): 
    x_table.append([int(k) for k in eachLine.split()]) 

полный код для Numpy версии:

import numpy 
x_table = numpy.loadtxt(open(filename_1,"r").read()) 

забудьте захватить исключения в обоих кодов.

0
x_table = [] 
for line in filename_1: 
    numbers = map(int, line.split(' ')) 
    x_table.append(numbers) 

позаботилась о:

  • многоразрядных чисел
  • отрицательные числа (знак минус)
0

Вы можете использовать регулярные выражения. В этом примере будут анализироваться десятичные знаки, негативы и исключить текст.

"""Contents of test.txt: 
1 2 3.14 4 5 0 text 
6 7 -8 9 10 -99.99 
some other text 
1.0 0.5 
""" 

import re 

filename_1 = open("test.txt", 'r') 
values = re.findall(r"-*\d+\.*\d*", filename_1.read()) 

print values 

Обратите внимание, что это вернет список. Затем вы можете преобразовать значения в int или float.

0

Простой:

file = open("myfile.dat", "r") 

matrix = [] 
for line in file: 
    matrix.append(line.split()[:]) 
Смежные вопросы