有许多关于在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文件中还有许多行不包含等号,有些行需要忽略,有些行用冒号(:)分隔,但这是另一个故事。
答案 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()
遗憾的是无法发表评论,但你说得对,我更改了字典名称。