2016-12-03 100 views
0

我有这个格式的字符串的文件:.B:13 &答:4 & I:1 &我:! & H:| - | & H:} {& B:3 & H:![ - ] & &创建给定字符串的字典中的文本文件

它从一个 “”以“&”结尾,分隔每个条目键值对与“&”,最后分离其相应的价值与每个键一“:”
这是我到目前为止有:

//读取该数据
filehndl = open("text.dat") filedata = filehndl.read() filehndl.close()

但我不知道如何去除和拆分数据创建字典。任何帮助,将不胜感激!

+3

从列表搜索'python split''python dict和搜索,有很多解决方案。 –

回答

1

可以剥去第一和最后一个字符用:

filedata = filedata[1:-1] 

然后与分裂:

entries = filedata.split('&') 

然后分裂条目并把它们放在一个字典:

out_dict = {} 
for entry in entries: 
    entry_array = entry.split(':') 
    out_dict[entry_array[0]] = entry_array[1] 

所以你一共有

filehndl = open("text.dat") 
filedata = filehndl.read() 
filedata = filedata[1:-1] 

entries = filedata.split('&') 

out_dict = {} 
for entry in entries: 
    entry_array = entry.split(':') 
    out_dict[entry_array[0]] = entry_array[1] 

# out_dict is what you now want to work with 

filehndl.close() 
+0

谢谢!再次提到问题,我在out_dict [entry_array [0]] = entry_array [1] – Sakizzle

+0

处得到索引超出范围错误我假设你已经从其他响应中得出结论,但是对于其他响应:第二个到最后一个&符号也需要被剥离,所以第三行应该是'filedata = filedata [1:-1]' –

+0

我仍然有点困惑,为什么我得到最后一行的IndexError for循环 – Sakizzle

0

我会假设你的文件只有一个单一的线,你不处理引用,这样,那么你可以用一台发电机理解做到这一点:

with open("yourfile.txt") as file: 
    data = file.read().strip() 
    if data.startswith(".") and data.endswith("&"): 
     clean = data.lstrip(".").rstrip("&") 
     print dict(item.split(":") for item in clean.split("&")) 

这里最重要的行是:

dict(item.split(":") for item in clean.split("&")) 

这将会由&性格分裂的字符串,然后由:性格再次分裂,在字典中终于“转换”列表中。

1

1衬垫版本假设你的FILEDATA将1个衬垫也

1日拆分字典项目由&剥去.&后,再由:

filedata = r'.B:13&A:4&I:1&I:!&H:|-|&H:}{&B:!3&H:[-]&&' 
d = dict(i.split(':') for i in filedata.strip('.&\r\n').split('&')) 
# {'A': '4', 'I': '!', 'B': '!3', 'H': '[-]'} 
内置的字典分裂键值对

但这并不关心重复的项目具有相同的密钥,例如,您有重复的密钥B,后面的B:!3将覆盖以前的B:13