将文件转换为python dict

时间:2015-01-30 13:42:54

标签: python parsing dictionary

这是我想要转换为python dict的文件:

#
# DATABASE 
#
Database name   FooFileName
Database file   FooDBFile
Info file       FooInfoFile
Database ID     3
Total entries   8888

我尝试了几件事情,但我无法将其转换成字典。我最终希望能够将“数据库文件”作为字符串进行挑选。提前谢谢。

以下是我已经尝试过的以及错误:

    # ValueError: need more than 1 value to unpack
    #d = {}
    #for line in json_dump:
        #for k,v in [line.strip().split('\n')]:
    #    for k,v in [line.strip().split(None, 1)]:
    #        d[k] = v.strip()
    #print d
    #print d['Database file']


    # IndexError: list index out of range
    #d = {}
    #for line in json_dump:
    #    line = line.strip()
    #    parts = [p.strip() for p in line.split('/n')]
    #    d[parts[0]] = (parts[1], parts[2])
    #print d

3 个答案:

答案 0 :(得分:1)

首先,您需要在最后#之后分隔字符串。您可以使用正则表达式执行此操作,re.search将执行此操作:

>>> import re
>>> s="""#
... # DATABASE 
... #
... Database name   FooFileName
... Database file   FooDBFile
... Info file       FooInfoFile
... Database ID     3
... Total entries   8888"""

>>> re.search(r'#\n([^#]+)',s).group(1)
'Database name   FooFileName\nDatabase file   FooDBFile\nInfo file       FooInfoFile\nDatabase ID     3\nTotal entries   8888'

同样在这种情况下,您可以使用split,您可以使用#拆分文本,然后选择最后一个元素:

>>> s2=s.split('#')[-1]

然后您可以使用dictionary comprehension和列表理解,请注意re.split对于这种情况是一个不错的选择,因为它使用r' {2,}'进行匹配2个或更多空格的分割:

>>> {k:v for k,v in [re.split(r' {2,}',i) for i in s2.split('\n') if i]}
{'Database name': 'FooFileName', 'Total entries': '8888', 'Database ID': '3', 'Database file': 'FooDBFile', 'Info file': 'FooInfoFile'}

答案 1 :(得分:0)

已编辑以反映行式正则表达式方法。

由于您的文件看起来不是制表符分隔的,因此您可以使用正则表达式来隔离列:

import re

#
# The rest of your code that loads up json_dump
#

d = {}
for line in json_dump:
    if line.startswith('#'): continue  ## For filtering out comment lines
    line = line.strip()

    #parts = [p.strip() for p in line.split('/n')]
    try:
        (key, value) = re.split(r'\s\s+', line)  ## Split the line of input using 2 or more consecutive white spaces as the delimiter
    except ValueError:  continue  ## Skip malformed lines

    #d[parts[0]] = (parts[1], parts[2])
    d[key] = value

print d

这会产生这个词典:

{'Database name': 'FooFileName', 'Total entries': '8888', 'Database ID': '3', 'Database file': 'FooDBFile', 'Info file': 'FooInfoFile'}

应该允许您隔离各个值。

答案 2 :(得分:0)

实际上当我们拆分时,它会返回一个包含3个值的列表,因此我们需要3个变量来存储返回的结果,现在我们将返回的第一个和第二个值组合在一起,用space分隔以充当一个键值,它是列表中返回的第三个值,这可能是最简单的方法,但我想它会完成你的工作并且很容易理解

d = {}
for line in json_dump:
    if line.startswith('#'): continue
    for u,k,v in line.strip().split():
        d[u+" "+k] = v.strip()
print d
print d['Database file']