我正在尝试从文件中读取一些数字并使用Python将它们存储到矩阵中。在文件中,在第一行,我有2个数字,n和m,行数和列数,在下一行,我有n * m个值。复杂的部分是在文件中,在第二行,例如,我没有m值,我只有m-2值。所以我不能一次读取一行文件,只是将值存储在矩阵中。编辑文件不是选项,因为我有200行和1000列的文件。 这是具有较少行和列的文件的外观:
4 5
1 2 3
4 5 1 2 3 4
5 1 2
3 4 5 1 2
3 4 5
我设法通过将所有值存储在数组中然后删除前两个值(n和m),然后从该数组创建矩阵来解决此问题。
这是我的代码:
f = open('somefile2.txt')
numbers = []
for eachLine in f:
line = eachLine.strip()
for x in eachLine.split(' '):
line2 = int(x)
numbers.append(line2)
f.close()
print numbers
n = numbers[0]
del numbers[0]
m = numbers[0]
del numbers[0]
print n, m, numbers
vector = []
matrix = []
for i in range(n):
for j in range(m):
vector.append(numbers[j])
matrix.append(vector)
vector = []
print matrix
这给了我预期的结果,但这是通过使用额外数组numbers
来实现它的正确方法,还是有一种更简单的方法可以将所有值直接存储到矩阵中? / p>
答案 0 :(得分:2)
您可以使用生成器功能:
def solve(f, n, m):
lis = []
for line in f:
if len(lis) > m:
yield lis[:m]
lis = lis[m:]
lis.extend(map(int, line.split()))
for i in xrange(0, len(lis), m):
yield lis[i:i+m]
with open('abc1') as f:
n, m = map(int, next(f).split())
# Now you can either load the whole array at once using the list() call,
# or use a simple iteration to get one row at a time.
matrix = list(solve(f, n, m))
print matrix
<强>输出:强>
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
另一种方法是获取文件中所有项目的展平迭代器,然后将迭代器拆分为相同大小的块。
from itertools import chain, islice
with open('abc1') as f:
n, m = map(int, next(f).split())
data = chain.from_iterable(map(int, line.split()) for line in f)
matrix = [list(islice(data, m)) for i in xrange(n)]
print matrix
#[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
相关:强>
答案 1 :(得分:1)
我的2美分:
with open('somefile.txt') as f:
strings = f.read().split()
numbers = map(int, strings)
m = numbers.pop(0)
n = numbers.pop(0)
matrix = [numbers[i:i+n] for i in xrange(0, m*n, n)]
在Python 3中,您只需执行以下操作:
m, n, *numbers = map(int, strings)
根据您想要对数据执行的操作,您可能需要查看NumPy,它有一些很好的方法来读取文本文件。