簡體   English   中英

使用python讀取文件並將值存儲在矩陣中

[英]reading a file and storing values in a matrix using python

我正在嘗試從文件中讀取一些數字,並使用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來實現的正確方法,還是將所有值直接存儲到矩陣中的簡便方法?

您可以使用生成器函數:

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]]

有關:

我的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,它有一些不錯的讀取文本文件的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM