Python读取由文件中的列的空格分隔的数组

时间:2017-11-23 16:43:22

标签: python arrays file

我有一个具有以下结构的文件:

1
2
3

23
33
55

1
2
4

...

等等。所以我想将数据提取到多维数组,即[[1,2,3], [23,33,55], [1,2,4]...]。到目前为止,我已尝试使用numpy.loadtxt()函数,但我得到了包含所有数字的一维数组,并尝试了此代码段:

data_tot = []
with open('file.txt', 'r') as infile:
     for line in infile:
         if line.rstrip() != '':
            data = []
            data.append(line.rstrip())
         else:
            data_tot.append(data)

其中data_tot是我想要的数组,但我得到类似data_tot = [[1], [23], [1] ...]

的内容

任何想法如何解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:2)

在您提供的代码段中,每当该行不为空时,data列表都会被清除。

data_buf = []
data_tot = []
with open('file.txt', 'r') as infile:
     for line in infile:
         if line.rstrip() == '':
            data_tot.append(data_buf[:])
            data_buf = []
         else:
            data_buf.append(line.rstrip())
if len(data_buf) > 0:
    data_tot.append(data_buf[:])

请注意,data_buf [:]复制列表对象以避免在下一次迭代中进行修改。此外,如果后面没有空行,则应将最后一个缓冲区添加到总列表中。

以下是使用StringIO而不是文件

的完整独立示例代码
import io

f = io.StringIO("""1
2
3

23
33
55

1
2
4
""")
data_buf = []
data_tot = []
with f as infile:
     for line in infile:
         if line.rstrip() == '':
            data_tot.append(data_buf[:])
            data_buf = []
         else:
            data_buf.append(line.rstrip())
data_tot.append(data_buf[:])

答案 1 :(得分:2)

您可以使用reshape

更改numpy数组的形状
#reshape the array to 3 by n 
np.loadtxt("file.txt").reshape(-1,3)

与你的数据应该给出:

[[  1.   2.   3.]
 [ 23.  33.  55.]
 [  1.   2.   4.]
 ...]