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

Leo*_*fox 3 python arrays floating-point file-io

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

我几乎把所有东西都整理成将数据转换成数组.

我基本上做(伪拷贝代码)

 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])
Run Code Online (Sandbox Code Playgroud)

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

e-s*_*tis 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)
Run Code Online (Sandbox Code Playgroud)

如果您经常处理这种数据,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)))
Run Code Online (Sandbox Code Playgroud)

如果你觉得狂野,你甚至可以完成这个完整的声明:

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]
Run Code Online (Sandbox Code Playgroud)

如果你真的想让你的同事讨厌你,你可以做一个班轮(不是所有的PYTHONIC :-):

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

剥离所有锅炉板和灵活性,你可以得到一个干净,可读的内衬.我不会使用它,因为我喜欢使用的反射潜力csv,但它可能是好的.这是一个灰色区域,所以我不会说它是Pythonic,但它确实很方便.

arrays = [np.array((array.float(i) for i in l.split())) for l in open(your_file))]
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 6

如果你想要一个numpy数组,文本文件中的每一行都有相同数量的值:

a = numpy.loadtxt('data.txt')
Run Code Online (Sandbox Code Playgroud)

没有numpy:

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

或者只是:

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