如何从fi填充2D数组

2024-04-27 01:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,每行有一个参数:

a1
b1
c1
a2
b2
c2
...

参数是字符行(不是数字)

我需要把它加载到二维数组中进行进一步的操作。 到目前为止,我成功地将这个文件上传到1D数组中:

ParametersRaw = []
with open(file1) as fh:
    ParametersRaw = fh.readlines()
fh.close()

NumberOfColumns = 7
NumberOfRows = len(ParametersRaw)/NumberOfColumns

Parameters = [[],[]]
i=0
j=0
k=0
while (i < NumberOfRows):
    while (j < NumberOfColumns):
        k = (i*NumberOfColumns)+j
        Parameters[i][j] = ParametersRaw[k]
        j = j + 1
    i = i + 1
    j = 0

它在Parameters[i][j] = ParametersRaw[k]行失败,出现错误:

IndexError: index 0 is out of bounds for axis 0 with size 0

在填充1D数组的情况下,我将使用append()方法。 但是在2D的情况下,我不知道如何应用append()。你知道吗

狮子座


Tags: 文件参数a1with情况数组b1parameters
3条回答

我不知道这是否能回答你的问题,但如果你从

parameters = [[''], ['']]

那么

parameters[0][0]

{is}

你所拥有的,Parameters = [[],[]],是一个包含两个空列表的列表。因为这些列表是空的,所以不能索引到它们中。你知道吗

您仍然可以使用append,但必须首先为每个值初始化空列表。你知道吗

>>> NumberOfRows = 5
>>> [[] for __ in range(NumberOfRows)]
[[], [], [], [], []]

然后可以对每个项目调用append

parameters = [[] for __ in range(NumberOfRows)]
for i in range(0,NumberOfRows,NumberOfColumns):
    for j in range(NumberOfColumns):
        k = i+j
        Parameters[i//NumberOfColumns].append(ParametersRaw[k])

记住range(0,NumberOfRows,NumberOfColumns):的用法,它与迭代i+=NumberOfColumns直到i >= NumberOfRows的用法相同

我希望这是你想要的方式!我无法测试它,因为我没有你的任何数据,所以只要评论,如果有什么不对劲:)

谢谢大家。下面是最后一段代码,它给我带来了很多麻烦,但现在却按照我想要的方式工作:

fRawData = []
with open(fStagingFile2) as fStagingFile2FH:
    fRawData = [line.strip() for line in fStagingFile2FH.readlines()]   # This is to read each element from the file and chop off the end of line character

fNumberOfColumns = 7
fNumberOfRows = len(fRawData)/fNumberOfColumns

fRowID = 0
fParameters = []
for fRowID in range(0, len(fRawData), fNumberOfColumns):
    fParameters.append(fRawData[fRowID:fRowID+fNumberOfColumns])    # This is to convert 1D array to 2D

# and down below section is an example of how to read each element of the list
# and how to update it if I need so.
fRowID = 0
fColumnID = 0
for fRowID in range(fNumberOfRows):
    for fColumnID in range(fNumberOfColumns):
        if fColumnID == 0:
            fParameters[fRowID][fColumnID] = "XXXX"
        Message2Log("fParameters[" + str(fRowID) + "][" + str(fColumnID) + "] = " + str(fParameters[fRowID][fColumnID]))

特写

相关问题 更多 >