如何从文本文件中分割的行创建嵌套列表?

3
我想把我的文本文件中的每一行都按空格字符“ ”分成三部分,并将这些三个部分组成一个列表,对于每一行,然后将所有这些列表组合成一个更大的列表。
我的文本文件:
1998/04/20 17:38:51.604 16.863014
1998/04/20 17:38:52.204 1.947639
1998/04/20 17:38:54.404 27.278648
1998/04/20 17:39:02.605 0.325151
1998/04/20 17:39:04.705 7.002871

我的代码:
dataList = []
metaData = ['', '', '']

with open('data.txt', 'r') as myTxt:
    for line in myTxt:
        metaData[0] = line.split(' ')[0]
        metaData[1] = line.split(' ')[1]
        metaData[2] = line.split(' ')[2]
        dataList.append(metaData)
    print(dataList)

我希望输出的结果是这样的:
[[1998/04/20, 17:38:51.604, 16.863014],
[1998/04/20, 17:38:52.204, 1.947639],
[1998/04/20, 17:38:54.404, 27.278648],
[1998/04/20, 17:39:02.605, 0.325151],
[1998/04/20, 17:39:04.705, 7.002871]]

但我得到的是这个:
[[1998/04/20, 17:39:04.705, 7.002871],
[1998/04/20, 17:39:04.705, 7.002871],
[1998/04/20, 17:39:04.705, 7.002871],
[1998/04/20, 17:39:04.705, 7.002871],
[1998/04/20, 17:39:04.705, 7.002871]]

这句话的意思是:“有人知道如何修复这个问题吗?在此先谢过。”

1
我找到了这个答案,解释了这里发生了什么。dataList实际上是填充了对metadata的引用。请注意,metadata本身没有被重新分配到新的列表中。它始终指向内存中的同一位置。只有它的值在改变。因此,由于它们都引用内存中的同一个列表,dataList中的旧值将与metadata同时更改。 - SacrificerXY
@eyllanesc 啊,我明白了,谢谢你的信息。你知道如何通过一些小改动让我的代码工作吗? - prs_wjy
@prasetya223 我只是编辑了你的问题。 - eyllanesc
1个回答

2
尝试这个:

试一下:

with open('data.txt', 'r') as myTxt:
    dataList = [i.strip().split() for i in myTxt.readlines()]

输出

[['1998/04/20', '17:38:51.604', '16.863014'], 
 ['1998/04/20', '17:38:52.204', '1.947639'], 
 ['1998/04/20', '17:38:54.404', '27.278648'], 
 ['1998/04/20', '17:39:02.605', '0.325151'], 
 ['1998/04/20', '17:39:04.705', '7.002871']]

根据评论区的要求,如果需要将列表转换为其他格式,请尝试以下方法:

dataList = [[' '.join([i, j]), k] for i,j,k in dataList]

它应该输出这个:
[['1998/04/20 17:38:51.604', '16.863014'], 
 ['1998/04/20 17:38:52.204', '1.947639'], 
 ['1998/04/20 17:38:54.404', '27.278648'],
 ['1998/04/20 17:39:02.605', '0.325151'],
 ['1998/04/20 17:39:04.705', '7.002871']]

如果你想在一行代码中得到上述结果,可以这样做:
with open('test2.txt', 'r') as myTxt:
    dataList = [[' '.join(i.strip().split()[:-1]),i.strip().split()[-1]] for i in in myTxt.readlines()]

谢谢,它起作用了! 抱歉再问一个问题,但你知道怎么让它变成这样吗? 输出: '1998/04/20 17:38:51.604', '16.863014' - prs_wjy
1
@prasetya223,我更新了我的答案,请查看! - Arkistarvh Kltzuonstev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接