阅读&将文件拆分成字典

时间:2016-01-07 11:25:19

标签: python python-2.7 dictionary io split

我有一个文件,我的数据就像:

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

因为我不知道如何处理作为列表的第二个拆分元素。

是否有其他方法可以轻松访问和使用任何输入文件?

4 个答案:

答案 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值的字符串,而无需自己解析值。