这是我想要转换为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
答案 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']