Python将文本文件读入字典,字符串列表

时间:2014-03-30 06:50:57

标签: python dictionary

我正在尝试将文本文件读入字典。 该文本文件包含一个人的姓名,网络和朋友'名。 字典的关键是人的名字,价值就是那个人的网络 这是文本文件:

Pritchett, Mitchell\n
Law Association\n
Dunphy, Claire\n
Tucker, Cameron\n
Dunphy, Luke\n
\n\n
Tucker, Cameron\n
Clown School\n
Wizard of Oz Fan Club\n
Pritchett, Mitchell\n
Pritchett, Gloria\n
\n\n
Dunphy, Alex\n
Orchestra\n
Chess Club\n
Dunphy, Luke\n

这就是我做的事情

def person_to_networks(file):

我收到该行的错误'如果" \ n"和","在lst [0]'。它说列表索引超出范围。 请帮我。我无法弄清楚这段代码有什么问题。

3 个答案:

答案 0 :(得分:0)

因为第一次通过循环,当lst仍然是[]时,你正试图访问lst [0]。

答案 1 :(得分:0)

至少第一行,lst是空列表([])。 你应该首先将一些值附加到第一个。


可能你想做以下事情:

if "\n" and "," in lst[0]:if "\n" and "," in line[0]:

elif "," not in lst[1:]:elif "," not in line[1:]:

最后一行中的

new_person_friends未定义。你需要解决这个问题。


当行为“\ n”时,lst将在networks更新后清除 而且你的数据有“\ n \ n”。这意味着连续2个空行。 在第二个“\ n”中,lst是空列表,因为处理了第一个“\ n” 您需要修复代码以避免出现这样的问题:if line == '\n' and lst != []:

答案 2 :(得分:0)

你得到那个错误是因为你正在将你的lst初始化为空[],然后检查第一个不存在的元素。

你说你想把你的文件变成字典,我建议这个更简单的代码:

import re  # import regex library
# open the file and import your data
f = open('data', 'r')
data = f.read()
f.close()
# initialize your data to be processed
dict = {}
data = data.replace('\\n', '') # remove \n characters
data = data.split('\n\n')      # split it into blocks
for block in data:
    block = block.split('\n')  # split each bock into lines
    nets = []
    for line in block:
        if ',' not in line and line != '': # find networks
            nets.append(line)
    block[0] = re.sub(r'(\w+),\s(\w+)', r'\2, \1', block[0])  # ADDED to switch first name and last name
    dict.update({block[0]: nets})   # update the result dictionary
print dict

这将为您建议的文件示例提供此结果:

{'Pritchett, Mitchell': ['Law Association'], 'Tucker, Cameron': ['Clown School', 'Wizard of Oz Fan Club'], 'Dunphy, Alex': ['Orchestra', 'Chess Club']}

如果这不是您想要的,请详细说明它是什么。

编辑:为了切换first namelast name,您可以在更新字典之前添加该行以进行该切换。我在上面的代码中添加了这一行,它使用了一个正则表达式(不要忘记在代码的开头添加“import re”):

'(\w+),\s(\w+)' # used to find the first name and last name and store them in \1 and \2 match groups.
'\2, \1'        # to replace the place of the match groups as required.
 OR '\2 \1'     # if you don't want the comma 

你可以随意操纵它,例如:你可以移除,或类似的东西。

切换后输出将变为:

{'Alex, Dunphy': ['Orchestra', 'Chess Club'], 'Cameron, Tucker': ['Clown School', 'Wizard of Oz Fan Club'], 'Mitchell, Pritchett': ['Law Association']}

修改:在firstlast名称之间切换的另一种方法(删除“import re”和之前添加的行并将其替换为三行具有相同的缩进):

s = block[0].split(', ')
s.reverse()
block[0] = ', '.join(s)  # or use ' '.join(s) if you don't want the comma

希望这会有所帮助。