我有一个文件,我的数据就像:
1 [0,1, 4, 89]
2 [3, 56, 6]
3 [3,4,0]
等等。
我想阅读此文件以在我的脚本中逐行访问数据,因此我尝试阅读我的文件并将其记忆在字典中:
dictionary = {}
with open('file.txt') as f:
for line in f:
nb, list = line.split(' ')
dictionary[nb] = list
然后我会做类似的事情:
for e in dictionary:
etc.
我有这个错误:
too many values to unpack
因为我不知道如何处理作为列表的第二个拆分元素。
是否有其他方法可以轻松访问和使用任何输入文件?
答案 0 :(得分:3)
首先,您可以设置str.split()
的maxsplit
参数。来自文件:
str.split(sep=None, maxsplit=-1)
使用sep作为分隔符字符串,返回字符串中的单词列表。如果给出maxsplit,则最多完成maxsplit拆分(因此,列表最多只有
maxsplit+1
个元素)。如果未指定maxsplit或-1
,则分割数量没有限制(所有可能的分割都会生成)。
演示:
>>> s = '1 [0,1, 4, 89]'
>>> s.split(' ', 1)
['1', '[0,1, 4, 89]']
>>> s.split(' ')
['1', '[0,1,', '4,', '89]']
>>> s.split(' ')[1]
'[0,1,'
>>> s.split(' ', 1)[1]
'[0,1, 4, 89]'
然后,您需要将列表转换为真实列表。我建议使用ast.literal_eval()
。来自文件:
ast.literal_eval(node_or_string)
安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,字节,数字,元组,列表,字符串,集合,布尔值和
None
。
例如:
>>> import ast
>>> s = '1 [0,1, 4, 89]'
>>> s.split(' ', 1)[1]
'[0,1, 4, 89]'
>>> ast.literal_eval(s.split(' ', 1)[1])
[0, 1, 4, 89]
>>> type(ast.literal_eval(s.split(' ', 1)[1]))
<class 'list'>
>>> type(s.split(' ', 1)[1])
<class 'str'>
如果您需要删除字符串后的\n
,请使用str.strip()
。来自文件:
str.strip([chars])
返回删除了前导和尾随字符的字符串副本。 chars参数是一个字符串,指定要删除的字符集。如果省略或None,则chars参数默认为删除空格。
像这样使用:
>>> ' 1 [0,1, 4, 89] '.strip()
'1 [0,1, 4, 89]'
>>> '1 [0,1, 4, 89]\n'.strip()
'1 [0,1, 4, 89]'
>>>
删除字符串前后的所有制表符,换行符,空格。如果您只想删除字符串前后的空格,换行符,请查看str.lstrip()
和str.rstrip()
。
所以你可以像这样写代码:
import ast
dictionary = {}
with open('file.txt') as f:
for line in f:
key, value = line.strip().split(1)
dictionary[key] = value
如果您希望dictionary
的键是int对象,只需使用int()
函数将其转换为:
import ast
dictionary = {}
with open('file.txt') as f:
for line in f:
key, value = line.strip().split(' ', 1)
dictionary[int(key)] = value
答案 1 :(得分:1)
这会吗?
import ast
d = dict()
with open('file.txt') as f:
for line in f:
k, l = line.split(' ', 1)
d[k] = ast.literal_eval(l)
print(d)
它产生
{'3': [3, 4, 0], '1': [0, 1, 4, 89], '2': [3, 56, 6]}
如果您希望键是整数而不是字符串,只需执行
d[int(k)] = ast.literal_eval(l)
答案 2 :(得分:1)
使用maxsplit
参数和ast.literal_eval()
:
import ast
dictionary = {}
with open('file.txt') as f:
for line in f:
nb, l = line.split(maxsplit=1)
dictionary[nb] = ast.literal_eval(l)
请注意,我已将list
的名称更改为不会屏蔽内置函数list()
的内容,并使用了任何空格的默认分隔符。< / p>
答案 3 :(得分:1)
对于保存评估使用ast.literal_eval:
from ast import literal_eval
data = {}
with open('file.txt') as fobj:
for line in fobj:
key, rest = line.split(None, 1)
data[key] = literal_eval(rest)
>>> data
{'1': [0, 1, 4, 89], '2': [3, 56, 6], '3': [3, 4, 0]}
来自文档:
ast.literal_eval(node_or_string)
这可用于安全地评估包含来自不受信任来源的Python值的字符串,而无需自己解析值。