<p>您可以使用<code>str.startswith()</code>来检查字符串是否以<code>'['</code>开头,并且仅当这是真的时才使用<code>ast.literal_eval()</code>。示例-</p>
<pre><code>with open("test.txt") as f:
registros = [ast.literal_eval(x) for x in f if x.startswith('[')]
</code></pre>
<p>演示-</p>
<pre><code>>>> 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']]
</code></pre>
<hr/>
<p>对于评论中的更新要求-</p>
<blockquote>
<p>How can I also read only the user info and assign it to a variable using this method?</p>
</blockquote>
<p>假设任何不是列表的行都是用户信息的一部分</p>
<p>您可以使用一个简单的for循环,如果行不是以<code>'['</code>开头,则继续追加到变量;如果行不是以<code>ast.literal_eval()</code>开头,则对其使用<code>ast.literal_eval()</code>,并将其追加到<code>registros</code>列表。你知道吗</p>
<p>示例-</p>
<pre><code>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
</code></pre>
<p>如果用户信息总是只有6行(如注释中所示),您还可以使用-</p>
<pre><code>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('[')]
</code></pre>