从具有无关紧要的空格的列表中读取数据

Reading data from list with inconsequential whitespacing

我是菜鸟,正在练习如何更好地从文件中读取数据等等。

我正在尝试从文件中提取温度数据,其中文件中数据元素之间的空格数无关紧要。

有问题的文件如下所示:

Year: 1975. Month: November.
10.2   3.2  4.6 12.7 8.9  9.1    10.11
9.4    2.8 10.9  10.7   17.3    2.2    9.6
11.5  6.0 7.4   6.5    10.3 4.5    3.2
4.1  6.7 8.5    6.2    9.9   5.6    3.1
2.3   1.1  14.1

我想将数据附加到嵌套列表中,其中每一行都是列表中的一个列表,如下所示:

[[10.2, 3.2, 4.6, 12.7, 8.9, 9.1, 10.11], [9.4, 2.8, 10.9, 10.7, 17.3, 2.2, 9.6],...,[2.3, 1.1, 14.1]]

现在我知道解决方案可能涉及使用嵌套 for 循环,但我仍在逐渐适应它们。我已经尝试了一堆不同类型的嵌套 for 循环,但其中 none 似乎给了我想要的结果。

我最接近的解决方案是使用以下代码:

list = []

with open("filename.txt", "r") as file:
    file.readline()
    for line in file:
        line.strip().split("\n")
        list.append(line)

print(list)

输出如下:

这显然不是我想要的。

['10.2   3.2  4.6 12.7 8.9  9.1    10.11\n', '9.4    2.8 10.9  10.7   17.3    2.2    9.6\n', (..)', '2.3   1.1  14.1']

如果有人可以帮助我解决这个问题并促进我在这个主题上的学习,我将不胜感激。

尝试:

my_list = []

with open(r"filename.txt", "r") as file:
    for line in file.readlines()[1:]:  # skip first line
        my_list.append([float(i) for i in line.strip().split()])

print(my_list)
[[10.2, 3.2, 4.6, 12.7, 8.9, 9.1, 10.11], [9.4, 2.8, 10.9, 10.7, 17.3, 2.2, 9.6], [11.5, 6.0, 7.4, 6.5, 10.3, 4.5, 3.2], [4.1, 6.7, 8.5, 6.2, 9.9, 5.6, 3.1], [2.3, 1.1, 14.1]]

正如 Michael Butscher 提到的,只需使用 split():

list = []

with open("filename.txt", "r") as file:
    file.readline()
    for line in file:
        row = line.split()
        # convert string list to float list
        row = [float(value) for value in row]
        list.append(row)

print(list)

输出

[[10.2, 3.2, 4.6, 12.7, 8.9, 9.1, 10.11], [9.4, 2.8, 10.9, 10.7, 17.3, 2.2, 9.6], [11.5, 6.0, 7.4, 6.5, 10.3, 4.5, 3.2], [4.1, 6.7, 8.5, 6.2, 9.9, 5.6, 3.1], [2.3, 1.1, 14.1]]

stripsplit 都不会“就地”改变其参数。 (字符串是不可变的,所以 strip 无论如何都做不到。split returns 一个字符串列表,所以也不会做)。因此,如果您分配给他们的结果就可以了。我们还将内容映射到浮点数,因为它们以字符串形式出现

res = []
with open("filename.txt") as file:
    # skip the very first line
    file.readline()
    # for each line...
    for line in file:
        # strip & split you did; also mapping to floats
        sub_list = [*map(float, line.rstrip("\n").split())]
        # storing in
        res.append(sub_list)

> res
[[10.2, 3.2, 4.6, 12.7, 8.9, 9.1, 10.11],
 [9.4, 2.8, 10.9, 10.7, 17.3, 2.2, 9.6],
 [11.5, 6.0, 7.4, 6.5, 10.3, 4.5, 3.2],
 [4.1, 6.7, 8.5, 6.2, 9.9, 5.6, 3.1],
 [2.3, 1.1, 14.1]]

注意:我使用 rstrip("\n") 专门右移最后的换行符。 (我们也可以在那里做 line[:-1]。)也使用 split() witohut 参数来分割任何空白。正如您所做的那样,它会尝试拆分换行符,但一行中不能有换行符(尤其是在您删除它之后)!

终于!使用 list 作为变量名是不好的!它隐藏了 Python 的内置 list... 所以我使用 res 作为“结果”:)