Python - 从txt文件创建一个dict

时间:2014-03-21 19:37:05

标签: python

我们得到一个文件(.txt)格式:

Johnson, Joana
Volleyball Club
Erickson, John
Mcdonald, Joe

Smith, Johnny
Debate Club
Chess Club
McIlroy, Molly
Dino, Dennis

Jackson, Jamie
Gibson, Ginny
Fried, John

我必须编写一个函数来调用这个文件并返回一个字典:{'first person's name':[每个节中的朋友列表]所以应该返回:

{'Johnson,Joana':['Erickson,John','Mcdonald,Joe'],'Smith,Johnny':['McIlroy,Molly','Dino,Dennis'],'Jackson,Jamie': ['Gibson,Ginny','Fried,John']}

我在下面编写了一个函数,但它只处理文件的第一个节而不是所有节,因此返回:

{'Johnson,Joana':['Erickson,John','Mcdonald,Joe']}

我只是python的初学者,所以如果有人可以帮助我而不会使它复杂化我会非常感激,我似乎无法处理整个文件

def name_to_friends(file):

    '''(file open for reading) -> dict of {str: list of str}
    '''

    for line in file:
        dic = {}
        lst = []
        for line in file:
            if line == '\n':
                dic.update({lst[0]:lst[1:]})
                break
            else:
                name = line.strip()        
                if ',' in line:
                    lst.append(line)
    return dic

2 个答案:

答案 0 :(得分:3)

你快到了;删除break;每次在字典中添加其他名称和朋友时清除列表对象:

def name_to_friends(file):
    for line in file:
        dic = {}
        lst = []
        for line in file:
            if line == '\n':
                dic.update({lst[0]:lst[1:]})
                lst = []
            else:
                name = line.strip()        
                if ',' in line:
                    lst.append(line)

        if lst:
            dic.update({lst[0]:lst[1:]})

    return dic

当文件末尾没有空行时,需要最后if lst

当您第一次遇到空行时,break语句将完全停止读取该文件;通过删除它,你可以继续下一个区块。

更惯用的方法是:

def name_to_friends(file):
    dic = {}

    for line in file:
        line = line.strip()
        # skip empty lines until we find the start of a block
        if not line:
            continue

        friends = dic[line] = []
        for line in file:
            line = line.strip()
            if not line:
                break  # end of block, continue to the next list of friends
            if ',' in line:
                friends.append(line)

    return dic

这会在第一个内部的文件行上嵌套第二个循环;这也会提高文件行的读取位置,所以当内循环停止时(因为文件已完成或我们只是读取一个空行),外循环将继续读取我们离开的位置。

答案 1 :(得分:3)

如果文件不是太大,您可以简单地执行类似

的操作
{k[0]: k[1:] for k in [l.split('\n') for l in file.read().split('\n\n')]}

编辑:删除俱乐部(无逗号)

{k[0]: [fr for fr in k[1:] if ',' in fr] for k in [ln.split('\n') for ln in file.read().split('\n\n')]}