在Python中将文本文件解析为字典

时间:2014-06-17 13:04:22

标签: python dictionary text-parsing

有许多关于在Python中解析文本文件的帖子,但我有一个特殊情况,其中txt文件并不总是很漂亮。

在一个完美的世界中,键和值将由同一行上的等号分隔,您可以逐行迭代并将值存储到字典中。但当然这不是一个完美的世界。这是我的txt文件的片段:

Map ID  = 
26
Device Type = iPhone OS
Tutorial viewed = false
Last 5 errors = (
    142,
    752,
    142,
    752,
    752
)

IP of Device     = XXX.XX.XXX.XX

在保持同一条线方面非常不一致。例如,有时候

Device Type = iPhone OS

有时

Device Type = iPhone
OS

有时候

Device Type = 
iPhone OS

通过这些文件的最佳方式是什么,所以无论出现什么样的可怕格式,我都可以获得类似下面代码的字典:

{'Map ID': 26,
 'Device Type': iPhone OS,
 'Tutorial viewed': false,
 'Last 5 errors': {142, 752, 142, 752, 752},
 'IP of Device': XXX.XX.XXX.XX}

txt文件中还有许多行不包含等号,有些行需要忽略,有些行用冒号(:)分隔,但这是另一个故事。

4 个答案:

答案 0 :(得分:3)

假设至少整个键总是与等号在同一行,你可以遍历这些行,如果该行是'key'行,则添加一个新条目,否则添加到最后一个键的条目:

d = {}
for line in infile:
    if "=" in line:
        key, val = map(str.strip, line.split("="))
        d[key] = val
    else:
        d[key] += line.strip()

此外,=必须永远不会出现在值中。输出示例:

{'IP of Device': 'XXX.XX.XXX.XX', 'Device Type': 'iPhone OS', 'Map ID': '26', 
 'Tutorial viewed': 'false', 'Last 5 errors': '(142,752,142,752,752)'}

答案 1 :(得分:2)

假设分隔符(在这种情况下为'=')从不是数据值的一部分,我会做这样的事情:

mydict = {}
key, val = None, ''
for line in dirty_file:
    if '=' in line:
        if key is not None:
            mydict[key] = val  # You might want to do type conversions here
        key, val = line.strip().split('=')
    else:
        val += line.strip()

if key is not None:  # For the final item
    mydict[key] = val

答案 2 :(得分:0)

我看到它的方式,你需要聚集线条,条件是你只遇到一个" ="在进行聚合时签名,因为这是分隔符的最佳选择。将错误元组解析为集合或“#34; false"字符串到布尔值取决于您的实现,但不要忘记在初始解析后剥离换行符。一段代码可能如下所示:

initial split = myText.split("=")
firstKey = split[0]
secondSplit = split[1].split(\n)
firstVal = secondSplit[:-1]
secondKey = secondSplit[-1]

这只是一个例子,而不是概括。你必须提出威胁第一个和最后一个部分作为特殊情况的逻辑,而中间部分几乎被视为同样的

答案 3 :(得分:0)

不知道文件的其余部分是如何显示的,但这可能有效:

d = {}
key = None
value = ''
with open(infile) as fin:
    for line in fin:
        if '=' in line:  # New key starting.
            if key:
                d[key] = value
            value = ''  # Reset.
            key = line.split('=')[0].strip()
            value += line.split('=')[1].strip()

        else:  # Only additional value in line.
            value += line.strip() 

遗憾的是无法发表评论,但你说得对,我更改了字典名称。