如何在Python中的文本文件中只读取列表?

use*_*341 1 python text list

我需要读这样的文本文件

bruce
chung
bruce@outlook.com
8893243
costarricense
divisa del informe colones
['nokia', 5277100.0, 'china']
['samsung', 10554200.0, 'turkey']
['apple', 52771000.0, 'argentina']
Run Code Online (Sandbox Code Playgroud)

但我需要只读取文件中的列表并将它们分配给一个新变量.

我用过这个

data =[ast.literal_eval(x) for x in open("test.txt")]
registros = data
Run Code Online (Sandbox Code Playgroud)

它之前运行良好,直到我添加了下面的用户信息.

有没有办法只阅读文本中的列表?

Ana*_*mar 5

您可以str.startswith()用来检查字符串是否以字符串开头'[',并且ast.literal_eval()只有在该字符串为真时才使用.示例 -

with open("test.txt") as f:
    registros = [ast.literal_eval(x) for x in f if x.startswith('[')]
Run Code Online (Sandbox Code Playgroud)

演示 -

>>> s = """bruce
... chung
... bruce@outlook.com
... 8893243
... costarricense
... divisa del informe colones
... ['nokia', 5277100.0, 'china']
... ['samsung', 10554200.0, 'turkey']
... ['apple', 52771000.0, 'argentina']""".splitlines()
>>> import ast
>>> registros = [ast.literal_eval(x) for x in s if x.startswith('[')]
>>> registros
[['nokia', 5277100.0, 'china'], ['samsung', 10554200.0, 'turkey'], ['apple', 52771000.0, 'argentina']]
Run Code Online (Sandbox Code Playgroud)

对于评论中的更新要求 -

我怎样才能只读取用户信息并使用此方法将其分配给变量?

假设任何不是列表的行都是用户信息的一部分

你可以使用一个简单的for循环,如果该行没有开始,则继续附加到变量'[',如果是,则使用ast.literal_eval()它,并将其附加到registros列表中.

示例 -

import ast
with open("test.txt") as f:
    user_info = ''
    registros = []
    for line in f:
        if line.startswith('['):
            registros.append(ast.literal_eval(line))
        else:
            user_info += line
Run Code Online (Sandbox Code Playgroud)

如果user_info总是只有6行(在注释中给出),你也可以使用 -

import ast
with open("test.txt") as f:
    user_info = ''
    for i,line in enumerate(f):
        user_info += line
        if  i==5:
            break
    registros = [ast.literal_eval(x) for x in f if x.startswith('[')]
Run Code Online (Sandbox Code Playgroud)