将文件读取为二维列表
我想把一个文件(比如说有5行3列的数据)读入一个二维列表中。
这是我目前的代码:
假设我的数据文件是:
1.0 2.1 3.4
1.1 2.5 3.0
2.1 2.4 2.8
2.6 2.5 5.6
1.8 8.3 5.4
fil = open('data.dat','r')
data = [[]] # initialize two-dim. list
for rows in fil:
cols = rows.split()
data.append(cols[i] for i in cols)
print(data[:][1])
所以我希望命令 print(data[:][1])
能打印出第二列的所有行。也就是说,输出应该是:
2.1
2.5
2.4
2.5
8.3
任何想法和帮助都非常感谢!
3 个回答
0
只需要把每一行的数据点添加到数据中就可以了。没必要在data
里面初始化一个列表。然后,如果你想获取某一列的数据,可以使用列表推导式:
fil = open('data.dat','r')
data = []
for rows in fil:
data.append(rows.split())
print([x[1] for x in data])
2
问题 1:填充 data
你需要添加一个生成器,这个生成器会为每一行提供列的数据。这意味着你的 data
看起来像这样:
[[], <generator>, <generator>, ...]
你想要做的是从一个空列表开始,然后为每一行添加列的数据:
data = []
for row in fil:
cols = row.split()
data.append(cols)
问题 2:打印 data
data[:][1]
的效果并不是你想要的。它会把 data
中的所有元素都拿出来(也就是复制这个列表),然后选择第二个元素。正确的做法是使用:
[row[1] for row in data]
这样可以获取每一行的第二列。为了让输出格式符合你的要求,你可以使用 string.join
:
print("\n".join(row[1] for row in data))
3
因为你的文件里全是数字,我建议你使用 numpy
这个工具:
>>> import numpy as np
>>> f = open("data.dat")
>>> data = np.loadtxt(f, delimiter=" ")
>>> data
array([[ 1. , 2.1, 3.4],
[ 1.1, 2.5, 3. ],
[ 2.1, 2.4, 2.8],
[ 2.6, 2.5, 5.6],
[ 1.8, 8.3, 5.4]])
这样的话,你也可以很方便地从数据中选择单独的列:
>>> data[:,1]
array([ 2.1, 2.5, 2.4, 2.5, 8.3])