ValueError:从文本文件解析列表时,格式错误的节点或字符串错误

时间:2019-12-02 19:12:42

标签: python python-3.x list

我在文件中存储了一些文本,如下所示:

[10, 1575311969.9649343, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles']
[101, 1575311971.3570273, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles']

现在,我想在我的代码中将其作为二维列表:

batches = [[10, 1575311969.9649343, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles'],
           [101, 1575311971.3570273, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles']]

我尝试使用代码

from ast import literal_eval

with open('runBatchBackup.txt', 'r') as f:
    batches = literal_eval('[' + f.read() + ']')

但这导致了

ValueError: malformed node or string: <_ast.Subscript object at 0x03C72BB0>

如何将文本文件转换为所需的格式?

2 个答案:

答案 0 :(得分:0)

您的文件是用换行符分隔的,但是literal_eval需要用逗号分隔每个子列表才能使其可解析。您可以向replace添加呼叫以执行从换行符到逗号的转换:

batches = literal_eval('[' + f.read().replace('\n', ',') + ']')

结果:

[[10, 1575311969.9649343, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles'], 
[101, 1575311971.3570273, 'Hot Brew', 10, True, 'No tank', 'Organic Red Helles']]

尽管以上代码段清楚地说明了问题,但我还是建议您使用列表理解将literal_eval应用于每一行:

batches = [literal_eval(line) for line in f]

答案 1 :(得分:0)

我认为单独literal_eval每行并将它们添加到程序列表中更有意义:

with open('runBatchBackup.txt', 'r') as f:
    batches = list(map(literal_eval, f))