将文件字符串读入数组(以pythonic方式)

时间:2011-06-02 10:31:03

标签: python arrays file-io floating-point

我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。

我几乎将所有内容都整理成将数据转换为数组。

我基本上做(伪拷贝码)

 line=file.readlines()
 line=line.split(' ') # Or whatever separator
 array=np.array(line)
 #And then iterate over every value casting them as floats
      newarray[i]=array.float(array[i])

这有效,但似乎有点违反直觉和反麻风,我想知道是否有更好的方法来处理来自文件的输入,最后有一个充满浮点数的数组。

5 个答案:

答案 0 :(得分:7)

快速回答:

arrays = []
for line in open(your_file): # no need to use readlines if you don't want to store them
    # use a list comprehension to build your array on the fly
    new_array = np.array((array.float(i) for i in line.split(' '))) 
    arrays.append(new_array)

如果您经常处理此类数据,csv模块将提供帮助。

import csv

arrays = []
# declare the format of you csv file and Python will turn line into
# lists for you 
parser = csv.reader(open(your_file), delimiter=' '))
for l in parser: 
    arrays.append(np.array((array.float(i) for i in l)))

如果你觉得狂野,你甚至可以完全声明:

import csv

parser = csv.reader(open(your_file), delimiter=' '))
make_array = lambda row : np.array((array.float(i) for i in row)) 
arrays = [make_array(row) for row in parser]

如果你真的希望你的同事讨厌你,你可以制作一个班轮(不是所有的PYTHONIC: - ):

arrays = [np.array((array.float(i) for i in r)) for r in csv.reader(open(your_file), delimiter=' '))]

剥离所有锅炉板和柔韧性,最终可以得到一个干净且易读的衬里。我不会使用它,因为我喜欢使用csv的反应潜力,但它可能是好的。这是一个灰色区域,所以我不会说它是Pythonic,但它确实很方便。

arrays = [np.array((array.float(i) for i in l.split())) for l in open(your_file))]

答案 1 :(得分:6)

If you want a numpy array and each row in the text file has the same number of values

a = numpy.loadtxt('data.txt')

没有numpy:

with open('data.txt') as f:
    arrays = list(csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC))

Or just

with open('data.txt') as f:
    arrays = [map(float, line.split()) for line in f]

答案 2 :(得分:3)

以下内容如何:

import numpy as np

arrays = []
for line in open('data.txt'):
  arrays.append(np.array([float(val) for val in line.rstrip('\n').split(' ') if val != '']))

答案 3 :(得分:1)

一种可能的单线:

a_list = [map(float, line.split(' ')) for line in a_file]

请注意,我在这里使用了map()而不是嵌套列表理解来帮助提高可读性。

如果你想要一个numpy数组:

an_array = np.array([map(float, line.split(' ')) for line in a_file])

答案 4 :(得分:0)

我会使用正则表达式

导入重新

all_lines = ''.join( file.readlines() )

new_array = np.array( re.findall('[\d.E+-]+', all_lines), float)

np.reshape( new_array, (m,n) )

首先将文件合并为一个长字符串,然后仅提取与浮点数对应的表达式('[\ d.E + - ]'用于科学计数法,但您也可以使用 '[\ d。]'仅用于浮点表达式。)